ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Инсталляция, обновления, нюансы БД, администрирование системы

Модератор: mike

Ответить
Аватара пользователя
vo
топ-софт
Сообщения: 63
Зарегистрирован: Чт, 07/05/2009 13:28
Имя Фамилия: Викторович Владимир
Откуда: Галактика
Контактная информация:

ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение vo »

Может мой опыт кому-то пригодится... Промучался сегодня полдня прежде чем понял в чем дело.

Обрабатывал txt-файл с помощью функции ReadLn, которая в упор не хотела нарезать файл по строкам. Позднее догадался, что дело в следующем.

Иногда приходится работать с текстовыми файлами, созданными в Unix-среде. Такие текстовые файлы характеризуются тем, что в них в качестве стандартного сочетания окончания строки используется chr(10). При этом текстовые файлы созданные в Windows-среде используют в качестве стандартного окончания строки сочетание символов chr(13)+chr(10). Если текстовый файл, созданный в Unix-среде разбирать функцией ReadLn, то считывание происходит не по строкам, т.к. символ chr(10) не воспринимается как символ окончания строки.

ПРЕДЛАГАЮ:
Доработать Атлантис, чтобы он воспринимал в качестве окончания строки как win-сочетание
chr(13)+chr(10), так и Unix-сочетание - chr(10).
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение cruger »

Предлагаю обойтись сторонними средствами.
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение vadim »

например, должна спасти вот такая программка на паскале

Код: Выделить всё

var
  f1,f2: file of byte;
  i: byte;
const
  a:byte=13;
begin
  assign(f1, paramstr(1));
  assign(f2, paramstr(2));
  reset(f1);
  rewrite(f2);
  while not eof(f1) do
    begin
      read(f1, i);
      if i = 10 then
        write(f2, a);
      write(f2, i);
    end;
  close(f1);
  close(f2);
end.
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение cruger »

Вадим, там же Unix, а к нему много что есть. Например, unix2dos.
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение vadim »

он же не из юникса галактику запускает, а всего лишь работает с текстовыми файлами, созданными в юникс-среде.
я так понял из постановки вопроса.
может так случиться, что и юникса-то у него нет, а только файлы такие приходят, например сгенерированные какой-нибудь внешней системой.
действительно, утилит много. но если найти сложно, а есть под рукой паскаль - можно воспользоваться предложенной программкой :)
Аватара пользователя
vo
топ-софт
Сообщения: 63
Зарегистрирован: Чт, 07/05/2009 13:28
Имя Фамилия: Викторович Владимир
Откуда: Галактика
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение vo »

vadim писал(а):...может так случиться, что и юникса-то у него нет, а только файлы такие приходят, например сгенерированные какой-нибудь внешней системой...
Действительно так. Утилита должна работать в среде win.

vadim, благодарю за подсказку!

Т.е. последовательность действий следующая:
скомпилить предложенную программку,
задекларировать ее в Галактике как дополнительную функцию,
и пользовать?

или скомпилить данную программку в exe и вызывать из программого кода Галактики?

Действительно, выход найти можно, но в сущности не совсем понятно, почему же все таки нельзя доработать ReadLn, поскольку доработка, по всей видимости, по трудоемкости вообще никакая...
m0p3e
заказчик
Сообщения: 46
Зарегистрирован: Вт, 13/01/2009 10:52
Имя Фамилия: Сергей Головчак
Откуда: Гипротрубопровод

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение m0p3e »

А зачем такие сложности?
Можно не прибегать к сторонним средствам. Достаточно читать файл посимвольно.

Код: Выделить всё

var c : char;
While not(mFile.eof) Do
 {
  mFile.Read(c);
  If c = chr(10)
   ........................
 }
Аватара пользователя
vo
топ-софт
Сообщения: 63
Зарегистрирован: Чт, 07/05/2009 13:28
Имя Фамилия: Викторович Владимир
Откуда: Галактика
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение vo »

m0p3e писал(а):А зачем такие сложности?
Можно не прибегать к сторонним средствам. Достаточно читать файл посимвольно.

Код: Выделить всё

var c : char;
While not(mFile.eof) Do
 {
  mFile.Read(c);
  If c = chr(10)
   ........................
 }
Во-первых, Read предназначена для работы с бинарными файлами и открывает она их по-другому - т.е. например первый символ из текстового файла не виден, при таком открытии. (Но это только то, что я заметил. Дальше не разбирался).
Во-вторых, предложенный код - это еще не весь код, который нужно написать, чтобы порезать текст по строкам... Т.е. приходится прикладнику вместо одной строки кода писать 10. В то время как 9 из них уже написаны на уровне атлантиса и нужно только дополнительный if там в одной строчке где-то добавить и проблема будет решена системно! В данной ситуации, считаю, что должно быть системное решение. Это правильнее и вообще не трудозатратно.
m0p3e
заказчик
Сообщения: 46
Зарегистрирован: Вт, 13/01/2009 10:52
Имя Фамилия: Сергей Головчак
Откуда: Гипротрубопровод

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение m0p3e »

А я вроде нигде и не писал, что этот способ снимает необходимость доработки ReadLn. Данный способ был предложен вместо подключения внешних программ/библиотек.
Уже несколько раз читал файлы таким способом и никакие символы никуда не пропадали. Набросать интерфейсик с несколькими Public функциями: Open, EOF и аналога ReadLn под конкретную задачу займет не больше часа.
Аватара пользователя
vo
топ-софт
Сообщения: 63
Зарегистрирован: Чт, 07/05/2009 13:28
Имя Фамилия: Викторович Владимир
Откуда: Галактика
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение vo »

m0p3e писал(а):...Уже несколько раз читал файлы таким способом и никакие символы никуда не пропадали. Набросать интерфейсик с несколькими Public функциями: Open, EOF и аналога ReadLn под конкретную задачу займет не больше часа.
Может поделитесь таким интерфейсиком, если имеется?
m0p3e
заказчик
Сообщения: 46
Зарегистрирован: Вт, 13/01/2009 10:52
Имя Фамилия: Сергей Головчак
Откуда: Гипротрубопровод

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение m0p3e »

Готового нет. Вот набросал. Вроде работает на не-Unix файлах. Теоретически должно работать и на них. Конечно нужно добавить обработку исключений и прочего...

Код: Выделить всё

#ifdef ComponentVersion
#component "C_UNIX"
#end

Interface UnixFile;

File hFile;

Public Function OpenFile ( FileName : string ) : boolean;
{
 Result := hFile.OpenFile ( FileName, stOpen );
 If Result
   hFile.Seek ( 0 );
}; //Function Open

Public Function ReadLn : string;
{
 Result := '';

 var c : char; c:= '';
 var i : Integer; i := 0;
 While ( not hFile.Eof and i < 256 and c <> chr ( 10 ) ) Do
  {
   hFile.Read ( c );
   If c <> chr ( 13 )
     {
      Inc ( i );
      If c <> chr ( 10 )
        Result += c;
     };
  };
}; //Function ReadLn

Public Function EOF : boolean;
{
 Result := hFile.EOF;
}; //Function EOF

Public Procedure CloseFile;
{
 hFile.Close;
}; //Function Close

END.


Interface ReadUnixFile;

var uFile : UnixFile;

HandleEvent
cmInit :
 {
  var FileName : string; FileName := '';
  FileName := GetFileName ( '*.*', 'Выберите файл' );
  If FileName <> ''
   If uFile.OpenFile ( FileName )
    {
     While ( not uFile.EOF ) Do
      {
       LogStrToFile ( 'C:\uFile.log', 'Result=' + uFile.ReadLn );
      };
     uFile.CloseFile;
    };
 }; //cmInit
End;
END.
Интересно будет ли пропадать первый символ.
Аватара пользователя
vo
топ-софт
Сообщения: 63
Зарегистрирован: Чт, 07/05/2009 13:28
Имя Фамилия: Викторович Владимир
Откуда: Галактика
Контактная информация:

Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред

Сообщение vo »

m0p3e писал(а):Интересно будет ли пропадать первый символ.
Спасибо! Проверю-отпишусь.
Ответить