如何在读取文件时确定换行符

时间:2015-07-30 18:19:55

标签: autoit

我有一个主要适用的AutoIt脚本。读取文件,写出我想要的内容,但它不保留原始换行符。如果我读取一个UNIX格式文件(仅限LF),它将写出一个Windows格式文件(CR和LF)。

如果没有像Python一样转向更健壮的东西,我如何在AutoIt中解决这个问题?

Opt("MustDeclareVars", 1)   ;0 = no, 1 = require pre-declare

#include <File.au3>
#include <Array.au3>

Local $gInPath = $CmdLine[1]
Local $NumberOfLines = $CmdLine[2]
Local $gInDrive, $gInDir, $gInFName, $gInExt, $gOutPath
Local $gMsgBoxTitle = "Error in " & @ScriptName
Local $InLine
Local $LineCount
Local $oFileIn
Local $oFileOut
Local $FileStringAppend

If FileExists($gInPath) Then
Else
    MsgBox(4096, $gMsgBoxTitle, "This file does not exist" & @CRLF & $gInPath)
    Exit
EndIf

_PathSplit($gInPath, $gInDrive, $gInDir, $gInFName, $gInExt)

If $NumberOfLines >= 1000000 Then
    $FileStringAppend = $NumberOfLines / 1000000 & "M"
ElseIf $NumberOfLines >= 1000 Then
    $FileStringAppend = $NumberOfLines / 1000 & "K"
Else
    $FileStringAppend = $NumberOfLines
EndIf

$gOutPath = _PathMake($gInDrive, $gInDir, $gInFName & "_" & $FileStringAppend, $gInExt)
If FileExists($gOutPath) Then
    MsgBox(4096, $gMsgBoxTitle, "File already exists" & @CRLF & $gOutPath)
    Exit
EndIf

$oFileIn = FileOpen($gInPath, 0)
$oFileOut = FileOpen($gOutPath, 1)

; Check if file opened for reading OK
If $oFileIn = -1 Then
    MsgBox(4096, $gMsgBoxTitle, "Unable to open file for read" & @CRLF & $gInPath)
    Exit
EndIf

; Check if file opened for writing OK
If $oFileOut = -1 Then
    MsgBox(4096, $gMsgBoxTitle, "Unable to open file for write." & @CRLF & $gOutPath)
    Exit
EndIf

; Read in lines of text until the EOF is reached
$LineCount = 0
While 1
    $InLine = FileReadLine($oFileIn)
    $LineCount += 1
    If @error = -1 Then ExitLoop
    If $LineCount > $NumberOfLines Then ExitLoop
    FileWriteLine($oFileOut, $InLine & @CRLF)
WEnd

FileClose($oFileIn)
FileClose($oFileOut)

2 个答案:

答案 0 :(得分:0)

查看此链接的功能文档 - https://www.autoitscript.com/autoit3/docs/functions/FileWriteLine.htm。您似乎可以在& @CRLF命令中取消FileWriteLine

AutoIt应该使用读入的相同行终止符,或

  

&#34;如果该行未以@CR或@LF结尾,则表示DOS换行(@CRLF)   将自动添加。&#34;

答案 1 :(得分:0)

这是我提出的解决方案。它有效,但我不确定它是最干净的。

Opt("MustDeclareVars", 1)   ;0 = no, 1 = require pre-declare

#include <File.au3>
#include <Array.au3>

Local $gInPath = $CmdLine[1]
Local $NumberOfLines = $CmdLine[2]
Local $gInDrive, $gInDir, $gInFName, $gInExt, $gOutPath
Local $gMsgBoxTitle = "Error in " & @ScriptName
Local $InLine
Local $LineCount
Local $oFileIn
Local $oFileOut
Local $FileStringAppend
Local Const $CHAR_READ_BLOCK = 100
Local $CharsRead = 0
Local $CrFound = 0
Local $LfFound = 0
Local $Newline
Local $InBlock

If FileExists($gInPath) Then
Else
    MsgBox(4096, $gMsgBoxTitle, "This file does not exist" & @CRLF & $gInPath)
    Exit
EndIf

_PathSplit($gInPath, $gInDrive, $gInDir, $gInFName, $gInExt)

If $NumberOfLines >= 1000000 Then
    $FileStringAppend = $NumberOfLines / 1000000 & "M"
ElseIf $NumberOfLines >= 1000 Then
    $FileStringAppend = $NumberOfLines / 1000 & "K"
Else
    $FileStringAppend = $NumberOfLines
EndIf

$gOutPath = _PathMake($gInDrive, $gInDir, $gInFName & "_" & $FileStringAppend, $gInExt)
If FileExists($gOutPath) Then
    MsgBox(4096, $gMsgBoxTitle, "File already exists" & @CRLF & $gOutPath)
    Exit
EndIf

$oFileIn = FileOpen($gInPath, 0)
$oFileOut = FileOpen($gOutPath, 1)

; Check if file opened for reading OK
If $oFileIn = -1 Then
    MsgBox(4096, $gMsgBoxTitle, "Unable to open file for read" & @CRLF & $gInPath)
    Exit
EndIf

; Check if file opened for writing OK
If $oFileOut = -1 Then
    MsgBox(4096, $gMsgBoxTitle, "Unable to open file for write." & @CRLF & $gOutPath)
    Exit
EndIf

While $CrFound = 0 And $LfFound = 0
    $CharsRead += $CHAR_READ_BLOCK
    $InBlock = FileRead($oFileIn, $CharsRead)
    If StringRight($InBlock, 1) = @CR Then
        $InBlock = $InBlock & FileRead($oFileIn, $CharsRead)
    EndIf

    $CrFound = StringInStr($InBlock, @CR)
    $LfFound = StringInStr($InBlock, @LF)

    If $CrFound > 0 And $LfFound > 0 Then
        $Newline = @CRLF
    ElseIf $CrFound > 0 Then
        $Newline = @CR
    Else
        $Newline = @LF
    EndIf
WEnd

; Read first line of text
$InLine = FileReadLine($oFileIn, 1)
$LineCount = 1
FileWriteLine($oFileOut, $InLine & $Newline)

; Read in lines of text until the EOF is reached
While 1
    $InLine = FileReadLine($oFileIn)
    $LineCount += 1
    If @error = -1 Then ExitLoop
    If $LineCount > $NumberOfLines Then ExitLoop
    FileWriteLine($oFileOut, $InLine & $Newline)
WEnd

FileClose($oFileIn)
FileClose($oFileOut)