Автор Тема: Lazarus / Импорт данных из CSV-файла  (Прочитано 2483 раз)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Всем привет!

Нужно из CSV-файла внести данные в БД, некий импорт в базу сделать.
Я вот так читаю файл:
procedure TForm1.Button1Click(Sender: TObject);
var
  sCSV : TStringList;
  s : String;
begin
  if OpenDialog1.Execute then
    begin
      sCSV := TStringList.Create;
      sCSV.LoadFromFile(OpenDialog1.FileName);
      for s in sCSV do
      begin
        with SQLQuery1 do
        begin
          Close;
          SQL.Text := 'INSERT INTO test (city,street) VALUES ('+s+')';
          ShowMessage(SQL.Text);
          //ExecSQL;
        end;
      end;
    end
end;
Проблема такая: в запрос вставляются данные вида: "city;street" или "city,street", а нужно "'city','street'" (то есть значения в кавычки нужно заключить)

Подскажите, как сделать.
Заранее спасибо.
« Последнее редактирование: 18.03.2015 10:15:50 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #1 : 18.03.2015 10:21:04 »
Обратные слеши не помогут ?

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #2 : 18.03.2015 10:36:25 »
Обратные слеши не помогут ?
Где ? Не понял...

Я пока пересохранил в Calc с заключением каждого значения в кавычки.
Мне вообще базу надо наполнить, так что пойдёт, а вот если приделывать такую возможность в приложении, то... тут надо думать....
Сноси Винду, переходи на Линукс ! :)

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #3 : 18.03.2015 13:02:31 »
Я не знаю синтаксиса языка, может так и нельзя, а имел ввиду, что-то подобное:

 SQL.Text := 'INSERT INTO test (city,street) VALUES ('\'+s+\' ');

Оффлайн alxl

  • Давно тут
  • **
  • Сообщений: 128
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #4 : 18.03.2015 13:38:48 »
А как выглядит этот csv файл? пару строчек, думаю достаточно будет.

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #5 : 18.03.2015 14:06:51 »
SQL.Text := 'INSERT INTO test (city,street) VALUES ('\'+s+\' ');
Нее, у меня в "s" строка вида: "город,улица". И нужно город взять в кавычки и улицу тоже в кавычки.
Должно получиться так:
SQL.Text := 'INSERT INTO test (city,street) VALUES ("город","улица");
А как выглядит этот csv файл? пару строчек, думаю достаточно будет.
Пример файла:
москва,ленина
екатеринбург,жукова
казань,победы
или то же самое, только через ";":
москва;ленина
екатеринбург;жукова
казань;победы

А вообще шикарно было, построчно читать файл и из него по номеру индекса (номер столбца) обращаться к значению...
Например как на bash:
while read line; do
  set -- $line
  echo $1
  echo $2
done < file
Сноси Винду, переходи на Линукс ! :)

Оффлайн Rik

  • Давно тут
  • **
  • Сообщений: 186
    • Визуальные технологии
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #6 : 18.03.2015 14:50:27 »
Цитировать
uses strutils;
........
S := '''' + ReplaceStr(S, ',', ''',''') + '''';
...........
SQL.Text := 'INSERT INTO test (city,street) VALUES ('+S+')';

Это заменит все вхождения запятой на запятую с кавычками. Помните, что в SQL запросе в кавычки берутся только текстовые данные, если работать нужно будет с числами, этот вариант не прокатит.

S := '''' + ReplaceStr(S, ';', ''',''') + '''';
Это заменит все вхождения ; на ','

Можете попробовать компонент fpspreadsheet - парсер Excel документов (97-2003) для fpc,  CSV то-же заявлен в поддержке.
« Последнее редактирование: 18.03.2015 15:04:12 от Rik »
visual-t.ru Кросс-платформенные технологии визуальной разработки ПО.

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #7 : 18.03.2015 22:03:47 »
я бы разбил строку и потом собирал уже с кавычками...

как разбить
http://forum.lazarus.freepascal.org/index.php?topic=9789.0

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 147
    • Email
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #8 : 18.03.2015 22:16:41 »
Спасиб, гляну позже.
Сейчас пока через Calc решил.
Сноси Винду, переходи на Линукс ! :)

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 972
Re: Lazarus / Импорт данных из CSV-файла
« Ответ #9 : 18.03.2015 22:19:02 »
если проблема с разбором строки, кодировками файла и БД, а она может быть из-за того что в дельфях однобайтовая а тут 2 байта в УТФ, то тут человек подробно проблемки описал
http://ikos2123.ru/rabota-so-strokami-v-lazarus.html