Сторонняя программа сохраняет таблицу в текстовый файл с разделителем - @TAB (табуляция)
(Строка заголовков всегда одинаковая, из нее можно получить кол-во "столбцов")
Но строки, последний элемент которых "пустой" она сохраняет как:
данные01@TABданные02
(пример: bad_file.txt)
что не нравится скрипту чтения файла в 2d массив, он требует такое:
данные01@TABданные02@TAB
(пример: good_file.txt)
(Возможен даже вариант с двумя "пустыми" данные01@TAB@TAB, в "плохом" файле никакой табуляции два раза в конце не будет)
Как побороть проблему?
Может быть прочитать файл в одномерный масив,
подсчитать количество элементов в строке заголовков,
обработать каждую следующую строку на предмет добавления @TAB в конец, если в ней количество элементов будет меньше?
А потом уже переводить в 2d? (понятия не имею как это скажется на скорости)
(Строка заголовков всегда одинаковая, из нее можно получить кол-во "столбцов")
Но строки, последний элемент которых "пустой" она сохраняет как:
данные01@TABданные02
(пример: bad_file.txt)
что не нравится скрипту чтения файла в 2d массив, он требует такое:
данные01@TABданные02@TAB
(пример: good_file.txt)
(Возможен даже вариант с двумя "пустыми" данные01@TAB@TAB, в "плохом" файле никакой табуляции два раза в конце не будет)
Как побороть проблему?
Код:
#include-Once
#include <File.au3>
#include <Array.au3>
$file = @ScriptDir & "\bad_file.txt"
;~ $file = @ScriptDir & "\good_file.txt"
Global $2DArray
Global $delim = @TAB
_FileToArray2D($file, $2DArray, $delim)
_ArrayDisplay($2DArray)
Func _FileToArray2D($aFile, ByRef $aArray, $aDelim, $aStartRow = 1, $aEndRow = 0)
Local $aRead, $aRows, $aColums, $aString
$aRead = FileOpen($aFile)
If $aStartRow < 1 Then $aStartRow = 1
$aRows = _FileCountLines($aFile) + 1 - $aStartRow
If $aEndRow >0 Then $aRows = $aRows - ($aRows - $aEndRow + $aStartRow -1)
If $aEndRow <0 Then $aRows = $aRows - ($aRows + $aEndRow)
$aColums = UBound(StringSplit(FileReadLine($aRead, $aStartRow), $aDelim))-1
FileSetPos($aRead, 0, $FILE_BEGIN)
FileReadLine($aRead,-1 + $aStartRow)
Local $aArrayTemp[$aRows + 1][$aColums]
$aArrayTemp[0][0] = $aRows
For $i = 1 to $aRows
$aString = StringSplit(FileReadLine($aRead), $aDelim)
For $k = 0 to $aColums -1
$aArrayTemp[$i][$k] = $aString[$k+1]
Next
Next
FileClose($aRead)
$aArray = $aArrayTemp
EndFunc
Может быть прочитать файл в одномерный масив,
подсчитать количество элементов в строке заголовков,
обработать каждую следующую строку на предмет добавления @TAB в конец, если в ней количество элементов будет меньше?
А потом уже переводить в 2d? (понятия не имею как это скажется на скорости)