Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/75: Рейтинг темы: голосов - 75, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15

При чтении текстового файла выдает иероглифы

26.01.2018, 18:35. Показов 14849. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
при чтении из csv файла выдает в memo иероглифы. Кодировка тут явно не причем так как не показывает даже цифры и англ. текст.
читаю

BlockRead(F, PChar(StrBuff)^, SizeFile);

где StrBuff:String
а F:file

при выводе StrBuff в memo показывает иероглифы. Подскажите плиз что делать уже весь инет облазил

Добавлено через 6 минут
забыл отметить что читаю побайтно Reset(F, SizeOf(Char));
Подозреваю что у меня в memo выводится бинарный код, но как перевести его в нормальный текст не могу понять
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2018, 18:35
Ответы с готовыми решениями:

Сделать, чтобы при чтении из текстового файла данные записывались в определенные колонки в ListView
Как сделать, чтобы при чтении из текстового файла данные записывались в определенные колонки в ListView?

Ошибка при чтении из файла
Ошибка при чтении записей из файла. Кто знает почему?? Все перепробовал:wall:

Ошибка при чтении файла
Всем привет. Помогите разобраться с ошибкой. Вот код: procedure TForm1.FormCreate(Sender: TObject); var m,n,o: TextFile; ...

26
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
26.01.2018, 19:12
Цитата Сообщение от Igor88878 Посмотреть сообщение
Подозреваю что у меня в memo выводится бинарный код,
Именно он и выводится, файл же без типа. Насколько помню csv файлы читают в Экселе.

Добавлено через 2 минуты
В Делфи эти файлы текстовые var f:TextFile.
0
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
26.01.2018, 19:17  [ТС]
textfile - не хочет открываться для побайтного чтения SizeOf(Char) выдает ошибку несовместимости типов.

А фаил в 2 гига эксель осилить не может
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
26.01.2018, 19:20
Зачем Вам побайтовое чтение? Файлы CSV читаются построчно.
0
Заблокирован
26.01.2018, 22:27
Да причём тут как читать? Скорее всего проблема в кодировке.
CSV 2 гига? Что это за таблица такая?

Добавлено через 5 минут
И вообще, кусок файла выложите. Я посмотрю что с ним делать. Лично у меня этот формат прекрасно читается.
Но выводить то надо не в мемо а в таблицу, если не ошибаюсь
0
Модератор
 Аватар для D1973
9905 / 6442 / 2455
Регистрация: 21.01.2014
Сообщений: 27,347
Записей в блоге: 3
27.01.2018, 06:57

Не по теме:

Цитата Сообщение от Lirrk Посмотреть сообщение
CSV 2 гига?
И не говорите... Чума какая-то...


Igor88878, формат scv - обычный текстовый формат для импорта/экспорта данных в Excel, просто каждое поле отделено от другого символом ";". Ключевое слово тут - "текстовый", поэтому ни к чему тут вся эта паскалевская заумь с поблочным чтением...
Ну, а с размером - это что-то неправдоподобное... Какой же Excel поднимет текстовый файл на 2 ГБ, это сколько же строк-то там? А Excel сколько строк понимает? (для справки - 1 048 576)

Добавлено через 1 минуту
Цитата Сообщение от Lirrk Посмотреть сообщение
Но выводить то надо не в мемо а в таблицу
Да оно вообще надо ли - выводить в визуальный компонент такой объемище? Это какие же тормоза-то будут?
1
Заблокирован
27.01.2018, 10:23
Без проблем. Вывод огромных файлов делается подгрузкой по частям. Но для этого надо завести потоки.
Проблема скорее всего в том что файл в формате UTF-8
Сомневаюсь чтоб эксель делал ANSI
К тому же не указана версия Delphi
Если файл в ANSI то проблема может возникнуть только в юникодовской версии, поскольку задан тип string.
Если версия юникодовская то файл в UTF-8
Если проблемы там и там то точно UTF-8
Надо попросту открыть файл в ворде и посмотреть что за кодировка и тогда можно уже решать и давать советы.
1
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
27.01.2018, 11:14  [ТС]
господа, я конечно не профи, но причем тут эксель причем тут кодировка? давайте абстрагируемся от CSV если просто взять текстовый фаил написать в нем "123" (согласитесь что кодировка тут не имеет значения) то при его открытии в memo или в greed будет выдавать иероглифы. тем методом что я описал. кодировку я перепробывал все для файла с текстом "123" это никак не влият на итог вывода в memo

Файлы в 2 гига выкладывются гос органами если кому интересно например декларации соотвествия товаров. 1 строка может быть больше килобайта строк сотни тысяч - может быть миллионов (не могу посчитать так как не отрыть фаил не одним известным мне редактором). В memo я вывожу просто для теста. С чтением побайтно проблем нет - фаил в 2 гига читается менее чем за 1 минуту даже побайтно. проблема с выводом

Вопрос состоит в том как открытый для побайтного чтения фаил вывести в виде текста?
0
554 / 484 / 191
Регистрация: 11.12.2013
Сообщений: 2,505
27.01.2018, 11:41
если открыть файл в notepad++ тоже выводит иероглифы?
0
Заблокирован
27.01.2018, 13:25
А потому что CSV это текстовый файл хранения таблицы.
И эксель это одно из популярных приложений, которое его создаёт. И в нём в качестве разделителя используется точка с запятой, хотя стандарт для CSV это запятая.
Если вы напишите 123 то проблем не будет.
А вот если если кроме 123 и латинского алфавита есть кириллица или другие языки. Японский там или ещё какой, тогда файл выходит в кодировке. И скорее всего UTF-8
Чтобы он отобразился, нужно специальное преобразование такого файла в юникод или в ANSI
Всё зависит от версии Delphi или используемых компонентов.

Для загрузки огромных файлов нужно организовать динамическую подгрузку.
Для этого надо освоить потоки.
И вообще такие огромные файлы - это бред. Тем более что больше 2 гигов они не могут быть в принципе.
Почему? Для измерения данных обычно использую integer А граница это типа как раз 2 гига
Для чтения данных болше 2 гиг надо оперировать с типом int64
И данные тем боле из госучереждений должны быть оптимизированы под это обстоятельств, по той причине, что хотя новое компы и оси есть, но должна быть поддержана совместимость со старыми...

Так что если вам всё же открыть... Нужно во-первых все integer где это допустимо переделать в Int64
Потом открыть файловый поток. FileStream
Организовать буфер с небольшим количеством данных в MemoryStream
Из FileStream вырезать нужный кусок и скопировать его в MemoryStream
В MemoryStream проверить кодировку и, если надо преобразовать её в нужную.
Потом MemoryStream загрузить куда надо. В Memo или таблицу.

Если надо дальше, опять вырезать нужный кусок и опять повторить....

И опять про кодировку. Если у вас не Delphi 7 а юникодовская версия Delphi преобразование необходимо в любом случае
Стандарт UTF-16
То есть если у вас только латинские буквы, цифры и стандартные знаки, приписывайте в старший байт нули
При этом надо учитывать, что размер данных вырастет в 2 раза
Впрочем существуют стандартные процедуры преобразования.
0
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
29.01.2018, 12:20  [ТС]
Цитата Сообщение от Lirrk Посмотреть сообщение
moryStream про
У меня XE4. Проблема возникает при отображении даже просто "123" - в этом то и суть.
кодировку я пробывал любую на фаил "123" она никак не влияет.

"Впрочем существуют стандартные процедуры преобразования." - о такой процедуре как раз и хотелось бы узнать. Какой процедурой можно преобразовать байт код для корректного его вывода в memo или greed? типа bytetotext или что нить типа того?

Добавлено через 6 минут
Цитата Сообщение от Алекcей Посмотреть сообщение
если открыть файл в notepad++ тоже выводит иероглифы?
notepad++ конечно же не может открыть такой файл - пишет нехватает памяти. При открытии через F3 в TotalCommander (режим просмотра) выдает windows-1251 - показывается все корректно. Но я повторюсь это не главное. Главное что я не могу ЛЮБОЙ текстовый фаил корректно отобразить в memo. Даже с английским языком или просто цифрами

Кстати если кому интересно то пример CSV такого порядка размеров можно скачать тут http://fsa.gov.ru/opendata/7736638268-rds/
0
5950 / 4526 / 1094
Регистрация: 29.08.2013
Сообщений: 28,111
Записей в блоге: 3
29.01.2018, 12:27
Цитата Сообщение от Igor88878 Посмотреть сообщение
при чтении из csv файла выдает в memo иероглифы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  FileName: string;
  TextReader: TStreamReader;
begin
  FileName := TPath.GetHomePath + TPath.DirectorySeparatorChar + 'Documents' + TPath.DirectorySeparatorChar + 'Utf8Text.txt';
  TextReader := TStreamReader.Create(FileName, TEncoding.UTF8);
  try
    while not TextReader.EndOfStream do
      ListBox1.Items.Add(TextReader.ReadLine);
  finally
    FreeAndNil(TextReader);
  end;
end;
вместо TEncoding.UTF8 можно переводить в другую кодировку

Добавлено через 46 секунд
Цитата Сообщение от Igor88878 Посмотреть сообщение
notepad++ конечно же не может открыть такой файл - пишет нехватает памяти.
тогда зачем грузить такой файл в мемо?
все повиснет и работать будет не возможно
0
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
29.01.2018, 12:32  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
тогда зачем грузить такой файл в мемо?
все повиснет и работать будет не возможно
В том то и дело что в memo он его весь загружает минут за 10. (правда показывает иероглифы). Хотя в memo, как я и писал выше, я гружу его просто для теста. В планах грузить в greed. Со скоростью еще предстоит поработать. (возможно буду выводить частями с пагинацией)
0
554 / 484 / 191
Регистрация: 11.12.2013
Сообщений: 2,505
29.01.2018, 12:48
можете выложить кусочек файла, где-нибудь строк 20-25?
0
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
29.01.2018, 12:59  [ТС]
Выкладываю. 8 строк только помещается в 20кб. Просьба переименовать в CSV (если хотите просмотреть в excel) Так как тут не дает выкладывать csv
Вложения
Тип файла: txt declare_sample.txt (17.4 Кб, 11 просмотров)
0
Заблокирован
29.01.2018, 13:09
Лучший ответ Сообщение было отмечено Igor88878 как решение

Решение

О боже..
Вы тут хором меня за дурака держите? Я вам писал а вы только других слушаете?
Ещё раз
У вас ANSI
Делфи у вас юникодовская.
Вот потому иероглифы.
Следовательно надо или тип StringANSI или преобразовать ваш файл в юникод.
Была бы у вас Delphi 7 проблем бы не было.
Попробуйте ваш этот файлик затащить в блокнот и сохранить как юникод и откройте в своей проге. Никаких иероглифов быть не должно
0
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
29.01.2018, 13:14  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
вместо TEncoding.UTF8 можно переводить в другую кодировку
Ваш пример корректно выводит текст в list но к сожалению при попытке открыть фаил в 500мб выдает ошибку "List index out of bounds (1024)"
0
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
29.01.2018, 13:22  [ТС]
Цитата Сообщение от Lirrk Посмотреть сообщение
Вы тут хором меня за дурака держите? Я вам писал а вы только других слушаете?
Коллега, я лично вас за дурака не считаю просто до проблем кодировки, мне вероятно еще предстоит дойти. Проблема состоит в том что если я создаю фаил в кодировке utf-8 без bom и содержимым "123123123123" (прилагаю его) то, при описанным мной методом, мне ровно также показываются иеролгифы которые выглядят так "㈱ㄳ㌲㈱ㄳ㌲". Такая кодировка по вашей версии должна выводить в memo 123123123123 ?
Вложения
Тип файла: txt 123.txt (12 байт, 11 просмотров)
0
0 / 0 / 0
Регистрация: 26.01.2018
Сообщений: 15
29.01.2018, 13:33  [ТС]
Цитата Сообщение от Lirrk Посмотреть сообщение
О боже..
Вы тут хором меня за дурака держите? Я вам писал а вы только других слушаете?
Ещё раз
У вас ANSI
Делфи у вас юникодовская.
Вот потому иероглифы.
Следовательно надо или тип StringANSI или преобразовать ваш файл в юникод.
Была бы у вас Delphi 7 проблем бы не было.
Попробуйте ваш этот файлик затащить в блокнот и сохранить как юникод и откройте в своей проге. Никаких иероглифов быть не должно

Коллега оказался прав. Просто у меня никак не укладывалось в голове что английские символы и цифры могли быть как то зависимы от кодировки. AnsiString помогло. Благодарю за помощь!
0
Заблокирован
29.01.2018, 13:42
utf-8 не поддерживается напрямую. Опять же требуется юникод. А это UTF-16
utf-8 - это побайтовый формат. Чтобы его прочитать существует функция utf8ToWide точнее не помню с лёту...
И потом, для вашей задачи лучше вообще забыть о юникоде и использовать обычные компоненты. И вообще делать на 7ом Delphi
да, иероглифы останутся, но это не критично. Все поиски замены сортировки удаление и любые другие операции прекрасно реализуются на ANSI компонентах
Для того чтобы отобразить результат в должном виде нужно всего лишь выводить строки через преобразователь в юникод в юникодовский компонет

Ещё раз. Все юникидовские версии Delphi используют UTF-16
Если ващи гигантские файлы перевести в этот юникод они станут в 2 раза больше. utf-8 тоже, но поменьше.

Но у вас файл в ANSI Я не знаю, есть ли возможность переключить из юникода в АNSI в старших версиях, я просто в них не работал и не буду работать... 64битные приложения нужны для грандиозных проектов... и мои запросы намного скромнее... хватает 32 бит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2018, 13:42
Помогаю со студенческими работами здесь

Ошибка при чтении из файла
Люди помогите! Вот код процедуры! procedure TForm1Show(Sender: TObject); var Fail:file of string; Put:string; begin ...

Ошибка при чтении файла
Доброго времени суток. Подскажите, если не трудно, в чем проблема. Требовалось: проверить, есть ли по указанному адресу файл, содержащий...

Trim не работает при чтении из файла?
Trim удаляет пробелы при задании строки в коде программы. Trim удаляет пробелы при чтении строки их Excel файла. Но Trim не удаляет...

При чтении из файла появляются символы
Весь код привожу на всякий случай, он еще не готов, не разбирайтесь особо в нем, просто посмотрите: Когда в процедуре Button4Click...

Ошибка при чтении из файла (reset)
вот часть кода if not res then str :=Edit1.Text else begin assignfile(txt,OpenDialog1.FileName); reset(txt); readln(txt,str);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru