Sign in to follow this  
Followers 0
leuce

Filecountlines gives negative number

7 posts in this topic

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

Share this post


Link to post
Share on other sites



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

Share this post


Link to post
Share on other sites

#3 ·  Posted (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 by MsCreatoR

Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1

AutoIt_Rus_Community.png AutoIt Russian Community

My Work...

AutoIt_Icon_small.pngProjects: 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 Program

AutoIt_Icon_small.pngUDFs: 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
 
AutoIt_Icon_small.pngExamples: 
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 AutoIt_Rating.gif)

* === My topics === *

==================================================
My_Userbar.gif
==================================================

AutoIt is simple, subtle, elegant. © AutoIt Team

Share this post


Link to post
Share on other sites

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
I 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:

CODE
include <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

Share this post


Link to post
Share on other sites

#5 ·  Posted (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 by rolok

Share this post


Link to post
Share on other sites

@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.

Share this post


Link to post
Share on other sites

#7 ·  Posted (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 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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0