Parse all the rows of a CSV file in a loop using AutoIt

后端 未结 3 396
走了就别回头了
走了就别回头了 2021-01-29 06:37

I have the following code to read a .csv file that contains two rows of data. I do not know what is wrong with it. How can I improve it to read a .csv file with two rows of data

相关标签:
3条回答
  • 2021-01-29 06:52

    Here is a program that will read a CSV file with 2 rows and output both data fields. If you have more rows change the input array to be larger.

    #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
    
    0 讨论(0)
  • 2021-01-29 06:56

    As for parsing a CSV file, you are likely better off using a library (user-defined functions), especially if you e.g. have complex CSVs with quoted strings (commas inside of the "cell"/string) or line breaks, which are hard to handle.

    The best I can recommend is CSVSplit. Basically you have a function _CSVSplit that takes a whole CSV file (content, i.e. string!) and returns you a two-dimensional array:

    Local $sCSV = FileRead($sFilePath)
    If @error Then ; ....
    
    $aSplitArray = _CSVSplit($sCSV, ",")
    

    You can then do everything you want with this array. Obviously, CSVSplit also provides the "reverse" function for turning an array into a CSV string again, _ArrayToCSV.

    0 讨论(0)
  • 2021-01-29 06:59

    return value of _ParseCSV() is 2D array like

    $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
    

    no need for includes

    params:

    1. filename
    2. delimeter
    3. message display if cannot open file
    4. logical true/false to skip the first line of the file

    ;_ParseCSV("filename",",","message if error happens",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
    
    0 讨论(0)
提交回复
热议问题