powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CSV в StringGrid
10 сообщений из 10, страница 1 из 1
CSV в StringGrid
    #39647372
Имеется csv-файл в кодировке UTF-16 (надо и русский язык, и европейский - буквы с точками)
1|4503680000275||0||Джинсы|ÄÄÄÄ||||50x55|307|73|10.70|0.10|7.40|2.60|5.50|0.73|1.00|3.10|p|2|4503680000415||0||Валенки|ÖÖÖÖ||||50x55|341|81|9.10|8.00|6.30|0.50|0.00|0.00|6.00|2.90|t|
Вот они тут, кстати, и не отображаются. Разделитель - символ |.
Перепробовал по разному сам csv файл - и с заголовком BOM (вроде так называается) и получаю яю1 в первой ячейке, а так же и без.

Проблема в том, что очевидно мой файл неправильного формата - пробую если LoadFromCSV - без результата.
Если как текст построчно, то получается, НО есть строки с очень длинным тестом
и там где не влезает (т.е. на вторую строку перенос), вылетает.

Как это победить?
Спасибо.
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647396
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а версию делфи сообщить?
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647764
Dephi 7.
Использую TNT (если применительно к ситуации это имеет значение).
Почему короткие строки (по одному значению) - обрабатываются нормально, а с разделителями такие проблемы?

Большое спасибо.
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647821
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На счет длинных строк.
Предполагаю что у тебя "длинные"="содержащеи пробелы".

Не знаю чем пользуется TNT и что это вообще такое, однако именно в D7 разделение CSV на поля средствами TStringList имеет особенности. Символ пробела внутри поля воспринимается так же как разделитель полей. Для того что бы избежать этого, нужно что бы поля содержащие пробелы были корректно окавычены функцией AnsiQuitedStr(), т.е. строка обрамляется кавычками ", а если они встречаются внутри строки - то там удваиваются.

В более поздних версиях Delphi эту проблемку с пробелами вроде как решили.

Если ты сам формируешь этот CSV то проще окавычить поля с пробелами, или вообще все поля.
Если CSV тебе дается свыше, от другого софта - то тут придется либо писать свой разборщик либо искать более другой компонент.

Может быть кто-то подкинет исходник TStringList от версии Delphi где это уже решено.
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647822
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnsiQuotedStr()
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647824
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеКомпетент(т.е. на вторую строку перенос), вылетает.Может этот класс поможет https://www.codeproject.com/tips/783493/WebControls/ • Field quoting allows multi-line field values and presence of quote and field separator characters within the field.
By default, it is assumed that field may or may not be enclosed in quotes but reader can be instructed not to use field quoting.
• Quote character by default is double quotes (0x22) but virtually any (Unicode) character can be used.
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647825
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеКомпетентDephi 7.ma1tusМожет этот класс поможетпропустил, не поможет
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647868
Использую TNT компоненты для отображения юникода, который Дельфи не поддерживает.
Файл готовлю сам в другой программе, поэтому все текстовые поля сделаю в " - кавычках. И посмотрю что получится.
В качестве разделителя - символ | - просто как гарантия того, что его не используют в тексте


Если открыть текстовый файл напрмер в блокноте, то реально есть строки более 1024 символов и строка переносится на другую строку.
Полагаю, в Дельфи ReadLn так же и видит строку до 1024 символов
Если открыть в Excel как csv, то нормально, НО Excel нормально откроет только если есть BOM, а он его (файл) распознает странно - тот самый BOM выдает за первую ячейку, "ЯЮ1"....

Учитывая все это, наиболее реальный вариант решения проблемы - именно csv и типа commatext, наверное.

Большое спасибо!
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647869
DelimitedText я имел ввиду
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
CSVClassFileOutLine := TStringList.Create;

CSVFileOutLine.Delimiter := ',';
CSVFileOutLine.QuoteChar := '"';
while not EOF(CSVFile) do
begin
  Readln(CSVFile, CSVFileLine);
  CSVFileOutLine.DelimitedText := CSVFileLine;
end;
...
Рейтинг: 0 / 0
CSV в StringGrid
    #39647878
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеКомпетентИспользую TNT компоненты для отображения юникода, который Дельфи не поддерживает.
Файл готовлю сам в другой программе, поэтому все текстовые поля сделаю в " - кавычках. И посмотрю что получится.
В качестве разделителя - символ | - просто как гарантия того, что его не используют в тексте


Если все поля кавычить - то разделитель вообще без разницы, главное что бы с кавычками не совпадал :)

НеКомпетентЕсли открыть текстовый файл напрмер в блокноте, то реально есть строки более 1024 символов и строка переносится на другую строку.

Это не перенос а способ отображения длинных строк.
В блокноте есть настройка которая говорит заворачивать длинные строки или нехай будут как есть, уходящие за правый край и c горизонтальным скроллом.
В блокноте на WinXP эта настройка тут: <Формат><перенос по словам>

НеКомпетентПолагаю, в Дельфи ReadLn так же и видит строку до 1024 символов

Я не в курсе на ограничение длины строки в Delphi, тем более юникодной, но никакой связи с переносом строки в блокноте тут нет.

Невредно так же почитать rfc на CSV

https://ru.wikipedia.org/wiki/CSV
http://www.rfc-editor.org/rfc/rfc4180.txt
http://tradeincome.ru/useful-content/RFC 4180 rus.pdf
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CSV в StringGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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