Проанализируйте все строки CSV-файла в цикле с помощью AutoIt.

У меня есть следующий код для чтения файла .csv, содержащего две строки данных. Я не знаю, что с ним не так. Как я могу улучшить его для чтения файла .csv с двумя строками данных?

#include <GUIConstants.au3>
#include <string.au3>

$file = FileOpen("test.csv", 0)

If $file = -1 Then
    MsgBox(0, "error", "File doesn't exist or can't be read")
    Exit
EndIf

$string = (FileReadLine($file, 1))
$input = StringSplit($string, ",", 1)
$input = StringSplit($string, ",", 1)
Local $value1 = $input[1]
ConsoleWrite("var=" & $value1)

person user1909028    schedule 17.12.2012    source источник
comment
Связано.   -  person user4157124    schedule 23.09.2017


Ответы (3)


возвращаемое значение _ParseCSV() представляет собой 2D-массив, например

$array[1][1] first line first data
$array[1][2] first line second data
$array[3][5] 3rd line 5th data

$array[0][0] gives number of lines
$array[0][1] gives number of data in each line

нет необходимости включать

параметры:

  1. имя файла
  2. разделитель
  3. отображение сообщения, если не удается открыть файл
  4. логическое true/false, чтобы пропустить первую строку файла

;_ParseCSV("имя файла",",","сообщение в случае ошибки",true)

Func _ParseCSV($f,$Dchar,$error,$skip)

  Local $array[500][500]
  Local $line = ""

  $i = 0
  $file = FileOpen($f,0)
  If $file = -1 Then
    MsgBox(0, "Error", $error)
    Return False
   EndIf

  ;skip 1st line
  If $skip Then $line = FileReadLine($file)

  While 1
       $i = $i + 1
       Local $line = FileReadLine($file)
       If @error = -1 Then ExitLoop
       $row_array = StringSplit($line,$Dchar)
        If $i == 1 Then $row_size = UBound($row_array) 
        If $row_size <> UBound($row_array) Then  MsgBox(0, "Error", "Row: " & $i & " has different size ")
        $row_size = UBound($row_array)
        $array = _arrayAdd_2d($array,$i,$row_array,$row_size)

   WEnd
  FileClose($file)
  $array[0][0] = $i-1 ;stores number of lines
   $array[0][1] = $row_size -1  ; stores number of data in a row (data corresponding to index 0 is the number of data in a row actually that's way the -1)
   Return $array

EndFunc
Func _arrayAdd_2d($array,$inwhich,$row_array,$row_size)
    For $i=1 To $row_size -1 Step 1
        $array[$inwhich][$i] = $row_array[$i]
  Next
  Return $array
   EndFunc
person Chris    schedule 14.12.2013

Вот программа, которая будет читать файл CSV с двумя строками и выводить оба поля данных. Если у вас больше строк, измените входной массив на больший.

#include <GUIConstants.au3>
#include <string.au3>

$file = FileOpen("test.csv", 0)

If $file = -1 Then
   MsgBox(0, "error", "File doesn't exist or can't be read")
   Exit
EndIf

   ; Read in lines of text until the EOF is reached
While 1
    Local $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
   $input = StringSplit($line, ",")

   ;This is reading fields 1 and 2. 
   ;The array index [0] 
   ;it will tell you how big the array is.
   Local $value1 = $input[1]
   Local $value2 = $input[2]
   ConsoleWrite("var=" & $value1)
   ConsoleWrite("var=" & $value2)

WEnd
person Whitecat    schedule 19.12.2012
comment
Следите за запятыми в кавычках, например. Имя Фамилия. - person Danik; 11.05.2014

Что касается анализа файла CSV, вам, вероятно, лучше использовать библиотеку (пользовательские функции), особенно если вы, например. имеют сложные CSV-файлы со строками в кавычках (запятые внутри «ячейки»/строки) или разрывами строк, с которыми трудно справиться.

Лучшее, что я могу порекомендовать, это CSVSplit. По сути, у вас есть функция _CSVSplit, которая берет весь файл CSV (содержимое, то есть строку!) и возвращает вам двумерный массив:

Local $sCSV = FileRead($sFilePath)
If @error Then ; ....

$aSplitArray = _CSVSplit($sCSV, ",")

Затем вы можете делать все, что хотите, с этим массивом. Очевидно, CSVSplit также предоставляет "обратную" функцию для повторного преобразования массива в строку CSV, _ArrayToCSV.

person rugk    schedule 12.03.2019