- Версия AutoIt
- 3.3.14.0
- Версия
- 3.3.14.0
При использовании _FileReadToArray для парсинга CSV файлов в массив столкнулся с ошибкой. Если в какой-либо из строк исходной таблицы не хватает элементов, либо присутствует лишний, скрипт вываливается.
Одним словом, функция _FileReadToArray работает только с "правильными" файлами.
Первое решение проверяет существует ли очередной элемент массива и если нет, оставляет в массиве пустое место, выглядит оно так:
Первый вариант достаточно быстрый.
Второй вариант реализовал через функцию _ArrayAdd, при работе с большими массивами он более долгий и в нем в случае ошибки (имеется ввиду - несовпадение количества элементов с эталонным) пропускается вся строка :
Одним словом, функция _FileReadToArray работает только с "правильными" файлами.
Первое решение проверяет существует ли очередной элемент массива и если нет, оставляет в массиве пустое место, выглядит оно так:
Код:
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <array.au3>
#include <String.au3>
#include <File.au3>
Func _elementExists($array, $element) ; function to check if array element exists
If $element > Ubound($array)-1 Then Return False ; element is out of the array bounds
Return true ; element is in array bounds
EndFunc
Func CSVParserDotComma($FileOpen) ; parser
Dim $aArray
_FileReadToArray($FileOpen, $aArray);загоняем файл в одномерный массив построчно, в нулевом элементе число строк
$columnsCounter = stringsplit($aArray[1],';'); определяем количество столбцов, разделитель ';'
Dim $aResult[$aArray[0] + 1][$columnsCounter[0] +1 ];объявляем массив с уже известным количеством строк и столбцов, в нулевых элементах содержится вся нужная информация
For $x = 1 to ($aArray[0]);заполняем итоговый массив, строки
$oneRow = stringsplit($aArray[$x],';'); разбиваем каждую строку в имеющемся одномерном массиве
For $y = 1 to ($columnsCounter[0]);заполняем итоговый массив, столбцы
if _elementExists($oneRow, $y) then; проверяем на наличие очередного элемента в столбце;вариант парсера с проверкой на наличие элемента
$aResult[$x][$y] = $oneRow[$y];
;MsgBox (1,1, 'row='&$x )
;$aResult[$x][$y] = $oneRow[$y]; вариант парсера без проверки на наличие элемента
EndIf
Next
Next
Return $aResult
EndFunc
$FileOpen = "table.csv"
Dim $aResult
CSVParserDotComma($FileOpen)
_ArrayDisplay($aResult)
Первый вариант достаточно быстрый.
Второй вариант реализовал через функцию _ArrayAdd, при работе с большими массивами он более долгий и в нем в случае ошибки (имеется ввиду - несовпадение количества элементов с эталонным) пропускается вся строка :
Код:
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <array.au3>
#include <String.au3>
#include <File.au3>
Func CSVParserDotComma($FileOpen) ; parser
Dim $aArray
_FileReadToArray($FileOpen, $aArray);загоняем файл в одномерный массив построчно, в нулевом элементе число строк
$columnsCounter = stringsplit($aArray[1],';'); определяем эталонное количество столбцов, разделитель ';'
Dim $aResult[1][$columnsCounter[0] +1 ];объявляем из одной строки массив с уже известным количеством столбцов
For $x = 1 to ($aArray[0]);заполняем итоговый массив, строки
local $oneRow = stringsplit($aArray[$x],';'); разбиваем каждую строку в имеющемся одномерном массиве
If $oneRow[0]=$columnsCounter[0] then; если эталонное количество столбцов и текущее совпадают
_ArrayAdd($aResult, $aArray[$x], 1, ";") ;то добавляем всю строку в новый массив, начиная с 1го столбца, разделитель столбцов ";"
Else
;MsgBox(1,1,"ошибка в строке "&$x)
EndIf
Next
Return $aResult
EndFunc
$FileOpen = "table.csv";
Dim $aResult
CSVParserDotComma($FileOpen)
_ArrayDisplay($aResult)
Последнее редактирование: