powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чтение файла CSV в TdxMemData
7 сообщений из 7, страница 1 из 1
Чтение файла CSV в TdxMemData
    #40132635
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер

Я имею некоторый файл вот такой структуры:
Код: 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
Чтение файла CSV в TdxMemData
    #40132718
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Прочитать файл вручную, скопировать код LoadFromTextFile и переписать ParseString
2. Переформатировать CSV так, чтобы в нём были УНИКАЛЬНЫЕ разделители
...
Рейтинг: 0 / 0
Чтение файла CSV в TdxMemData
    #40132721
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Чтение файла CSV в TdxMemData
    #40132816
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Чтение файла CSV в TdxMemData
    #40132824
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем у вас в коде после чтения файла стоит dxMemData2.Active:=True; ?
...
Рейтинг: 0 / 0
Чтение файла CSV в TdxMemData
    #40132910
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr ,

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

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

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


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