AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.06.2009, 14:41   #1  
anlex is offline
anlex
Участник
 
38 / 10 (1) +
Регистрация: 20.03.2009
Nav 4.0
обнаружилась проблема при разборе текстового файла по полям (не датапорт).
разделители полей = табуляторы (смотрел в других редакторах) код 9

TabChar := 9;
InFile.TEXTMODE(TRUE);
IF InFile.OPEN(InFileText) THEN BEGIN
REPEAT
nRead := InFile.READ(txtString);
IF nRead <> 0 THEN BEGIN
FOR i := 1 TO STRLEN(txtString) DO BEGIN
Chr := txtString[i];

IF Chr = TabChar THEN
newItem := TRUE - условие не выполняется никогда
.....................


в дебагере Chr = ' '- пробел, если в файле символ TAB. То есть похоже Nav заменяет символ TAB на пробел при такой конструкции чтения текстового файла....

Как решить?
Старый 01.07.2009, 08:07   #2  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Сталкивался с такой проблемой. Используйте потоки, там такой проблемы нет. Примерно так:

Код:
myFile.OPEN(inFileName);
 myFile.CREATEINSTREAM(inFileStream);
 WHILE NOT inFileStream.EOS DO BEGIN
   myBytesRead := inFileStream.READTEXT(TextBuffer, 900);
   IF myBytesRead > 0 THEN BEGIN
	 Обрабатываем TextBuffer
   END;
 END;
 myFile.CLOSE;
где TextBuffer - Text900. Можно любого размера, но тогда нужно его указать в качестве второго параметра inFileStream.READTEXT,
inFileStream - InStream.
Старый 01.07.2009, 08:27   #3  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Еще хочу предостеречь от следующей ошибки.
В справке написано:
Цитата:
READ (File)READ (File)
Use this function to read from an ASCII or binary file.

[Read] := File.READ(Variable)
Read
Data type: integer
This optional return value tells you the number of bytes read.

File
Data type: file
Use this variable to refer to the file.

Variable
Data type: any
The destination variable.

Comments
If TEXTMODE (File) is set to TRUE, the system reads a line of text from the file, evaluates it and sets the variable equal to the result.

If TEXTMODE is set to FALSE, the system determines the number of bytes to read based on the size of the variable.
Не верьте. При попытке в не текстовом режиме прочитать файл размером больше 10 байт, используя в качестве буфера Text10 получается ошибка переполнения.
Т.е. при попытке прочитать файл со строкой qwertyuiopqwertyuiop кодом:
Код:
myFile.TEXTMODE(FALSE);
myFile.OPEN('C:\test.dat');
BytesRead := myFile.READ(myBufer10);
MESSAGE('%1, %2, %3', BytesRead, myBufer10, MAXSTRLEN(myBufer10));
myFile.CLOSE;
возникает ошибка:
Цитата:
Текст 'qwertyuiopq' в READ параметр но. 1 слишком длинный.
Старый 01.07.2009, 12:06   #4  
anlex is offline
anlex
Участник
 
38 / 10 (1) +
Регистрация: 20.03.2009
спасибо. да все решил через потоки.

1) через потоки сначала изменил разделяющий символ с TAB на | (в бинарном виде)
2) потом уже разобрал по полям в обычном текстовом режиме.
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:44.