leuce Posted March 31, 2007 Posted March 31, 2007 G'day everyone Here's my script: #include <File.au3> $wftm = FileOpenDialog ("Select file", "", "Files (*.txt)") $wftmfile = FileOpen ($wftm, 0) $wflines = _FileCountLines ($wftm) MsgBox (0, "foo", $wflines) The actual number of lines in the file is about 6000. AutoIt tells me the number is -1260943. If I resave the text file from a text editor and give it a different name, the number of lines reported by AutoIt also changes. The file is a plain text file created in Windows. What can be wrong? The script detects the number of lines of other files correctly. Thanks Samuel
leuce Posted March 31, 2007 Author Posted March 31, 2007 G'day everyone Okay, I licked it. The file I was trying to open, was in fact Unicode (little endian). Now... is it at all possible to make my script work on such a file? Thanks Samuel
MrCreatoR Posted March 31, 2007 Posted March 31, 2007 (edited) Hi, This is hard to say, If you can, upload the file that have this problem. Or try this method to count lines (it's work for me every time): $wftm = FileOpenDialog ("Select file", "", "Files (*.txt)") $wftmfile = FileOpen ($wftm, 0) $wflines = _CountLinsInFile($wftm) MsgBox (0, "foo", $wflines) Func _CountLinsInFile($File) If Not FileExists($File) Or StringInStr(FileGetAttrib($File), "D") Then Return SetError(1, 0, 0) StringReplace(FileRead($File), @LF, "") Return @extended+1 EndFunc Edited March 31, 2007 by MsCreatoR Spoiler Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1 AutoIt Russian Community My Work... Spoiler Projects: ATT - Application Translate Tool {new}| BlockIt - Block files & folders {new}| SIP - Selected Image Preview {new}| SISCABMAN - SciTE Abbreviations Manager {new}| AutoIt Path Switcher | AutoIt Menu for Opera! | YouTube Download Center! | Desktop Icons Restorator | Math Tasks | KeyBoard & Mouse Cleaner | CaptureIt - Capture Images Utility | CheckFileSize ProgramUDFs: OnAutoItErrorRegister - Handle AutoIt critical errors {new}| AutoIt Syntax Highlight {new}| Opera Library! | Winamp Library | GetFolderToMenu | Custom_InputBox()! | _FileRun UDF | _CheckInput() UDF | _GUIInputSetOnlyNumbers() UDF | _FileGetValidName() UDF | _GUICtrlCreateRadioCBox UDF | _GuiCreateGrid() | _PathSplitByRegExp() | _GUICtrlListView_MoveItems - UDF | GUICtrlSetOnHover_UDF! | _ControlTab UDF! | _MouseSetOnEvent() UDF! | _ProcessListEx - UDF | GUICtrl_SetResizing - UDF! | Mod. for _IniString UDFs | _StringStripChars UDF | _ColorIsDarkShade UDF | _ColorConvertValue UDF | _GUICtrlTab_CoverBackground | CUI_App_UDF | _IncludeScripts UDF | _AutoIt3ExecuteCode | _DragList UDF | Mod. for _ListView_Progress | _ListView_SysLink | _GenerateRandomNumbers | _BlockInputEx | _IsPressedEx | OnAutoItExit Handler | _GUICtrlCreateTFLabel UDF | WinControlSetEvent UDF | Mod. for _DirGetSizeEx UDF Examples: ScreenSaver Demo - Matrix included | Gui Drag Without pause the script | _WinAttach()! | Turn Off/On Monitor | ComboBox Handler Example | Mod. for "Thinking Box" | Cool "About" Box | TasksBar Imitation Demo Like the Projects/UDFs/Examples? Please rate the topic (up-right corner of the post header: Rating ) * === My topics === * ================================================== ================================================== AutoIt is simple, subtle, elegant. © AutoIt Team
JailDoctor Posted May 9, 2008 Posted May 9, 2008 Or try this method to count lines (it's work for me every time): $wftm = FileOpenDialog ("Select file", "", "Files (*.txt)") $wftmfile = FileOpen ($wftm, 0) $wflines = _CountLinsInFile($wftm) MsgBox (0, "foo", $wflines) Func _CountLinsInFile($File) If Not FileExists($File) Or StringInStr(FileGetAttrib($File), "D") Then Return SetError(1, 0, 0) StringReplace(FileRead($File), @LF, "") Return @extended+1 EndFuncI tried this to solve a similar problem with your code and it didn't help. I create a txt file with an array from and excel sheet. They are sets of numbers, and usually are 2 to 200 or so. To be open to growth, I specify a top of 493 rows by the line: $XLArray = _ExcelReadArray($oExcel, 1, 1, 493, 1) Only the occupied cells should be placed in the txt file by: _FileWriteFromArray($sFile, $XLArray, 0) When I want to read the number of lines in the text file by $CountLines = _FileCountLines(@DesktopDir & "\My Test List.txt") I get 493 instead of 10 or whatever number is in the file. How can I solve this problem? Here is my code: CODEinclude <file.au3> #include <ExcelCOM_UDF.au3> Global $XLFilePath = @DesktopDir & "\uh_patsumlc_MRNOnly.xls" Global $oExcel, $XLArray $oExcel = _ExcelBookOpen($XLFilePath, @SW_HIDE) $XLArray = _ExcelReadArray($oExcel, 1, 1, 493, 1) ;here is where I determine how many rows to read Row 1, Column A, 493 rows, and direction down) _ExcelBookClose($oExcel) $sFile = @TempDir & "\My Test List.txt" ; Write first array to file by string file name _FileWriteFromArray($sFile, $XLArray, 0) $CountLines = _FileCountLines(@DesktopDir & "\My Test List.txt") ;your code: $wftm = FileOpenDialog ("Select file", "", "Files (*.txt)") $wftmfile = FileOpen ($wftm, 0) $wflines = _CountLinsInFile($wftm) MsgBox (0, "foo", $wflines) Func _CountLinsInFile($File) If Not FileExists($File) Or StringInStr(FileGetAttrib($File), "D") Then Return SetError(1, 0, 0) StringReplace(FileRead($File), @LF, "") Return @extended+1 EndFunc Exit
rolok Posted June 3, 2008 Posted June 3, 2008 (edited) It may also be a data issue. I've attached a .csv file that has data in it that will cause the function to return a negative number. If you view the file within a text editor like the wonderful ScitTe editor, you can easily see the offending data.RowCountBreaker.txt Edited June 3, 2008 by rolok
Kerros Posted June 3, 2008 Posted June 3, 2008 @rolok Just looking at the file, there are Null characters in there. Most languages are going to see a null and assume that it's the end of the line and/or file. Using your file I get 1 line, but not a negative number using this code. #include<file.au3> $File1 = @ScriptDir&'\RowCountBreaker.txt' $wftmfile = FileOpen ($File1, 0) $wflines = _CountLinsInFile($File1) MsgBox (0, "foo", $wflines) Func _CountLinsInFile($File) If Not FileExists($File) Or StringInStr(FileGetAttrib($File), "D") Then Return SetError(1, 0, 0) StringReplace(FileRead($File), @LF, "") Return @extended+1 EndFunc Kerros===============================================================How to learn scripting: Figure out enough to be dangerous, then ask for assistance.
ProgAndy Posted June 3, 2008 Posted June 3, 2008 (edited) It's Unicode, why this doesn't work: ; File.au3, Tylo <tylo at start dot no> Func _FileCountLines($sFilePath) Local $N = FileGetSize($sFilePath) - 1 If @error Or $N = -1 Then Return 0 Return StringLen(StringAddCR(FileRead($sFilePath, $N))) - $N + 1 EndFunc ;==>_FileCountLines The problem is, that one WChar has 2 bytes, not 1 as in ASCII, so You get the wrong count. (FileGetSize and StringLen don't return the same, then.) MrCreatoR's method works with your RowCountBreaker.txt, too Edited June 3, 2008 by ProgAndy *GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes
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