williamk Posted February 8, 2008 Share Posted February 8, 2008 Need to write a script that will take a txt file with several thousand lines. Each line looking something like: AME401|AMEZCUA |JOSE |CERVANTES | 9.00|630004|CR| Need to rewrite the lines so that they look like this: AME401;AMEZCUA, JOSE CERVANTES; 9.00;630004;CR So am basically removing a few delimeters, taking out the white space and replacing | with ;. I think the best way to do this to write each line to an array and then just write the array out to a new file in the format I want. However, the following code gives me the error "Array variable has incorrect number of subscripts or subscript dimension range exceeded.: " What am I doing wrong? #include <file.au3> #include <array.au3> DIM $extract $dirpath = "C:\" $outdir = "C:\" $empaddfn = "mast256.txt" $outf = Fileopen ($outdir & "empadd.txt",1) If Not _FileReadToArray($dirpath & $empaddfn,$extract) Then MsgBox(4096,"Error", " Error reading log to Array error:" & @error) Exit EndIf For $x = 1 to $extract[0] $array = StringSplit($extract[$x], "|") ; split the current line into $array using "|" as delimeter FileWrite($outf, $array[1] & ";" & $array[2] & ", " & $array[3] & " " & $array[4] & ";" & $array[5] & ";" & $array[6] & ";" & $array[7] & @CRLF) Next FileClose ($outf) Link to comment Share on other sites More sharing options...
Kademlia Posted February 8, 2008 Share Posted February 8, 2008 (edited) For $x = 1 to $extract[0] -1 <--- this should fix Would have written it a bit different: $inputfile = Fileopen("mast256.txt",0) $outputfile = Fileopen("empadd.txt",2) while 1 $line = FileReadLine($inputfile) if $line = "" then exitloop $array = StringSplit($line, "|") ; split the current line into $array using "|" as delimeter FileWrite($outf, $array[1] & ";" & $array[2] & ", " & $array[3] & " " & $array[4] & ";" & $array[5] & ";" & $array[6] & ";" & $array[7] & @CRLF) Wend FileClose ($inputfile ) FileClose($outputfile) Edited February 8, 2008 by Kademlia Link to comment Share on other sites More sharing options...
torun Posted February 8, 2008 Share Posted February 8, 2008 (edited) Why not do it this way? For $x = 1 to $extract[0] $extract[$x] = StringReplace($extract[$x], "|",";",1) ; the first occurrence $extract[$x] = StringReplace($extract[$x], "|",",",1) ; the second one $extract[$x] = StringReplace($extract[$x], "|",";") ; all the rest FileWrite($outf,$extract[$x] & @CRLF) Next Edited February 8, 2008 by torun Link to comment Share on other sites More sharing options...
Siao Posted February 8, 2008 Share Posted February 8, 2008 For $x = 1 to $extract[0] -1 <--- this should fixNo it shouldn't. This would make it skip the last line. "be smart, drink your wine" Link to comment Share on other sites More sharing options...
williamk Posted February 8, 2008 Author Share Posted February 8, 2008 Why not do it this way? For $x = 1 to $extract[0] $extract[$x] = StringReplace($extract[$x], "|",";",1) ; the first occurrence $extract[$x] = StringReplace($extract[$x], "|",",",1) ; the second one $extract[$x] = StringReplace($extract[$x], "|",";"); all the rest FileWrite($outf,$extract[$x] & @CRLF) NextHey guys, Yep either solution works. Cool. One last thing. How can I strip the white space (spaces) out of each element and or line? Link to comment Share on other sites More sharing options...
torun Posted February 8, 2008 Share Posted February 8, 2008 (edited) Check the last record (line) of the input file. If it is empty, remove it (remove the last CRLF). to remove white spaces: For $x = 1 to $extract[0] $extract[$x] = StringReplace($extract[$x], " |","|"); spaces before '|' $extract[$x] = StringReplace($extract[$x], "| ","|"); spaces following '|' $extract[$x] = StringReplace($extract[$x], "|",";",1); the first occurrence $extract[$x] = StringReplace($extract[$x], "|",",",1); the second one $extract[$x] = StringReplace($extract[$x], "|",";"); all the rest FileWrite($outf,$extract[$x] & @CRLF) Next Edited February 8, 2008 by torun Link to comment Share on other sites More sharing options...
williamk Posted February 8, 2008 Author Share Posted February 8, 2008 Check the last record (line) of the input file. If it is empty, remove it (remove the last CRLF). to remove white spaces: For $x = 1 to $extract[0] $extract[$x] = StringReplace($extract[$x], " |","|"); spaces before '|' $extract[$x] = StringReplace($extract[$x], "| ","|"); spaces following '|' $extract[$x] = StringReplace($extract[$x], "|",";",1); the first occurrence $extract[$x] = StringReplace($extract[$x], "|",",",1); the second one $extract[$x] = StringReplace($extract[$x], "|",";"); all the rest FileWrite($outf,$extract[$x] & @CRLF) Next That didn't seem to work. This however did: #include <file.au3> #include <array.au3> DIM $extract $dirpath = "C:\" $outdir = "C:\" $empaddfn = "mast256.txt" $inf = $dirpath & $empaddfn $outf = Fileopen ($outdir & "empadd.txt",2) If Not _FileReadToArray($inf,$extract) Then MsgBox(4096,"Error", " Error reading log to Array error:" & @error) Exit EndIf For $x = 1 to $extract[0] -1 $array = StringSplit($extract[$x], "|") ; split the current line into $array using "|" as delimeter $array[2] = stringstripWS ($array[2],2) $array[3] = stringstripWS ($array[3],2) $array[4] = stringstripWS ($array[4],3) $array[5] = stringstripWS ($array[5],1) if $array[7] = "MT" Then FileWrite($outf, $array[1] & ";" & $array[2] & ", " & $array[3] & " " & $array[4] & ";" & $array[5] & ";" & $array[6] & ";" & $array[7] & @CRLF) Endif Next FileClose ($outf) FileClose ($inf) Link to comment Share on other sites More sharing options...
torun Posted February 8, 2008 Share Posted February 8, 2008 (edited) This works here too: $inputfile = Fileopen("in.txt",0) $outputfile = Fileopen("out.txt",2) while 1 $line = FileReadLine($inputfile) if $line = "" then exitloop $line = StringReplace($line," |","|") ; spaces before '|' $line = StringReplace($line,"| ","|") ; spaces following '|' $line = StringReplace($line, "|",";",1); the first occurrence $line = StringReplace($line, "|",",",1); the second one $line = StringReplace($line, "|",";") ; all the rest FileWrite($outputfile,$line & @CRLF) Wend FileClose ($inputfile ) FileClose($outputfile) Edited February 10, 2008 by torun Link to comment Share on other sites More sharing options...
torun Posted February 10, 2008 Share Posted February 10, 2008 (edited) Or even shorter: $inputfile = Fileopen("in.txt",0) $outputfile = Fileopen("out.txt",2) while 1 $line = FileReadLine($inputfile) if $line = "" then exitloop $line = StringRegExpReplace($line,"(\|.+?) {0,1}\| {0,1}","$1,",1) $line = StringRegExpReplace($line," {0,1}\| {0,1}",";") FileWrite($outputfile,$line & @CRLF) Wend FileClose ($inputfile ) FileClose($outputfile) Edited February 10, 2008 by torun Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now