Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чтение файла CSV в TdxMemData / 7 сообщений из 7, страница 1 из 1
08.02.2022, 19:16
    #40132635
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла CSV в TdxMemData
Добрый вечер

Я имею некоторый файл вот такой структуры:
Код: xml
1.
2.
3.
4.
5.
field1,field2,field3,field4
a1,b1,"c1, some text, my text",d1
a2,b2,"c2, some text, my text",d2
a3,b3,"c3, some text, my text",d3
a4,b4,"c4, some text, my text",d4



В колонке field3 текст в кавычках с запятой. Между тем и разделитель данных тоже символ запятая. Я не могу поменять структуру файла, файл приходит из вне.

Читаю файл таким образом:
Код: pascal
1.
2.
3.
4.
dxMemData.Active:=False;
dxMemData.DelimiterChar:=',';
dxMemData.LoadFromTextFile('myfile.csv');
dxMemData.Active:=True;



Но получаю сообщение об ошибке:
Project myProject.exe raised exception class EdxException with message 'Invalid stream format'.

Проблема происходит, при чтении файла и разделении данных на столбцы символом разделителем. Однако, если символ разделитель находится внутри кавычек, то это уже не разделитель. Но dxMemData считает иначе.

А вот как ему это объяснить, я не совладал.
Подскажите, пожалуйста, как решить эту проблему?

Спасибо огромное
...
Рейтинг: 0 / 0
09.02.2022, 00:41
    #40132718
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла CSV в TdxMemData
1. Прочитать файл вручную, скопировать код LoadFromTextFile и переписать ParseString
2. Переформатировать CSV так, чтобы в нём были УНИКАЛЬНЫЕ разделители
...
Рейтинг: 0 / 0
09.02.2022, 01:13
    #40132721
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла CSV в TdxMemData
...
Рейтинг: 0 / 0
09.02.2022, 14:19
    #40132816
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла CSV в TdxMemData
DimaBr ,

Спасибо огромное, это очень помогло, однако я код переделал. Если файл усложнить, то Ваш код уже лажает. Но для меня он стал идеей, куда и как двигаться дальше.

Код: pascal
1.
2.
3.
4.
5.
field1,field2,field3,field4
a1,b1,"c1, some text, my text","d1, e1"
a2,b2,"c2, some text, my text",d2
a3,b3,"c3, some text, my text",d3
a4,b4,"c4, some text, my text",d4



Я сделал в итоге вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
var FileOnNet, LocalFileName: string;
sl : TStringList;
field : string;
i, AOffset, AQuoteL, AQuoteR: Integer;
begin
...
sl := TStringList.Create;
sl.LoadFromFile('myfile.csv');

  for i := 0 to sl.Count - 1 do
  begin
  AOffset := 0;
  sl[i] := StringReplace(sl[i], ',', #9,[rfReplaceAll]);
    repeat

    AQuoteL := PosEx('"', sl[i], AOffset+1);
    AQuoteR := PosEx('"', sl[i], AQuoteL+1);
    if AQuoteL > 0 then
    begin
    field := Copy(sl[i], AQuoteL+1, AQuoteR-AQuoteL-1);
    field := StringReplace(field, #9, ',',[rfReplaceAll]);
    sl[i] := StuffString(sl[i], AQuoteL+1, AQuoteR-AQuoteL-1, field);

    AOffset := AQuoteR + 1;
    end

    until PosEx('"', sl[i], AOffset+1) = 0;

  end;

sl.SaveToFile('myfile1.csv');
    dxMemData2.Active:=False;
    dxMemData2.DelimiterChar:=#9;
    dxMemData2.LoadFromTextFile('myfile1.csv');
    dxMemData2.Active:=True;
sl.Free;
end;
...
Рейтинг: 0 / 0
09.02.2022, 14:41
    #40132824
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла CSV в TdxMemData
Зачем у вас в коде после чтения файла стоит dxMemData2.Active:=True; ?
...
Рейтинг: 0 / 0
09.02.2022, 19:16
    #40132910
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла CSV в TdxMemData
DimaBr ,

"все побежали и я побежал"
Джентльмены удачи(с)

скопировал откуда-то...

не нужное оно?
...
Рейтинг: 0 / 0
10.02.2022, 08:09
    #40133009
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение файла CSV в TdxMemData
Если вы читатете датасет из файла, то по окончанию он ОДНОЗНАЧНО открыт (иначе как бы он читался)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чтение файла CSV в TdxMemData / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]