簡體   English   中英

如何逐行讀取批處理文件中多余字符的文本文件? 允許限制行長。(Windows,批處理腳本)

[英]How to read text file line by line which is excessing characters in batch file? Limiting the line length is allowed.(Windows, batch script)

##test.txt##
First line = 1;*|:12345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345
Second line = 5;*|:3215432;*|:21543215432154321543215432154321543215432154321543215432154321543215;*|:543215;*|:5432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321543215432154321

SetLocal EnableDelayedexpansion
for /F "tokens=* delims=" %%a in ('type "test.txt"') do (
            set "Line=%%a"
            echo Line: "!Line!"
)

很明顯,上面的代碼不能讀取test.txt中的2行,因為每行都超過了限制(8191個字符)。

通過打字

type "test.txt"

它仍然產生了 test.txt 文件中的 2 行。 但是,只要有 2 行進入 for 循環,就無法讀取這些行。

我不需要全長的行,因此我嘗試通過刪除字符串的多余部分來預處理文本文件。 例如,將上例中的行長度限制為 8100。

1.如何在windows環境下不使用記事本(任何GUI編輯器)編輯上述文本文件?

2.如果我不需要預處理文件,有什么技巧可以避免上述問題?

  • 即使我不能放胡蘿卜(^),它擴展了命令線。 我想要的是拆分字符串並取第一部分很好,但我不想通過記事本或其他 GUI 文件編輯器手動執行此操作。

您可以使用塊讀取器,它將每一行拆分為最大大小為 1023 個字符的塊。

@echo off
setlocal EnableDelayedExpansion

set pos=0
set line=
<long_text.txt (
    FOR /F "tokens=1 delims=:" %%1 in ('findstr /o "^" long_text.txt') DO (
        set new_pos=%%1
        set /a size=new_pos-pos
        set /a "chunks=(size-1+1022) / 1023"
        if defined line echo Line: !line! chunks=!chunks!

        set /a pos=new_pos
        for /L %%# in (1 1 !chunks!) do (
            set "partial="
            set /p partial=     
            if defined partial (
                echo   #!line! chunk %%# -- !partial:~0,10! ... !partial:~-10! 
            )
        )
        set /a line+=1
    )
)

這個怎么運作

外部FOR /F .. findstr /O循環用於通過計算兩行之間的位置差異來確定每行的長度。
行長度用於計算必須讀取多少才能獲取整行。

一行本身由set /p讀取(它從<long_text.txt的重定向中<long_text.txt )。 set /p的內置限制為 1023 個字符。

因此set /p用於時間。

要計算一行使用多少塊,行長度必須除以 1023,但必須減去 1 個字符,因為 LF 不計算(但 CR)。 +1022是事實的結果,也必須讀取最后一個完整塊之后的剩余字符。
如果該行是 1023 的倍數(也是空行),則最后一個塊可以為空。

唯一剩下的點是最后一行。
這種技術不會讀取最后一行,但很容易在前面附加一個空行。

如果您使用的是受支持的 Windows 系統,則 PowerShell 將可用。 20更改為每行所需的最大字符數。

powershell -NoLogo -NoProfile -Command ^
    "Get-Content -Path '.\longlines.txt' |" ^
        "ForEach-Object { $_.substring(0,[Math]::min($_.Length, 20)) }"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM