iT邦幫忙

0

BAT 編寫求助 (從文字檔內取得固定長度的值)

各位先進,不好意思小弟又來打擾了。

因小弟要對一個文字檔的內容做分析,但一直無法取得有效的數值,想請各位先進幫幫忙指點一下小弟。

文字檔內容大意:

第一行例:11122334455 (空格)(空格)(空格)(空格).... 12345(到止為含空格為256,後面可能有接續資料)最後為斷行符號 。

第二行例:11122334455 (空格)(空格)(空格)(空格).... 12345(到止為含空格為256,後面可能有接續資料)最後為斷行符號 。

結尾皆為斷行符號(ENTER)

希望結果:

1.固定取出長度256內的值,每取出256的值後就換讀下一條值。
2.遇到斷行符號則換行讀取至結束。
3.若由前開始算第11及第12位數為20且由後往前算第19位及第25位為零的話,將結果輸出。

目前思考方向:

直接土法鍊鋼,用FOR指定回數將讀出的值相加。
例:

FOR (0,1,255)

STR=STR+讀出的值至迴圈停止。

temp1=%str:~11,12

大約為以上楖念。

目前遇到的問題:

1.該如何指定讀取長度?
2.如何讀取檔案?(用過 for /f 失敗,遇到空格後就停止輸出了,有用過delims跳過空格一樣)
3.讀取到空白時則後不會在輸出結果。

以上,求各位先進幫幫忙,萬分感謝!

看更多先前的討論...收起先前的討論...
froce iT邦大師 6 級 ‧ 2019-07-23 08:15:42 檢舉
看不懂,不過你這種需求可以考慮用powershell或是其他語言來做...
在IT邦總覺得BATCH是萬能的.
froce iT邦大師 6 級 ‧ 2019-07-23 15:27:33 檢舉
我真的很佩服寫BATCH的人...
光是要我看就沒耐心了。XD
蟹老闆 iT邦大師 1 級 ‧ 2019-07-24 14:56:32 檢舉
我也看不懂

2 個回答

1
japhenchen
iT邦新手 3 級 ‧ 2019-07-23 09:49:19

用PowerShell吧,有類似Linux AWK的寫法

PowerShell如果在Windows2008/7之後都是內建在系統裡,如果沒有,請到你的控制台的程式與應用中勾上,或是到微軟網站下載POWERSHELL安裝,批次檔的副檔名是BAT,POWERSHELL的副檔名叫PS1 (啊就是某遊戲機的第一代的那個PS ONE)

$txt = Get-Content "a.txt" 
$total = ""
ForEach ($line in  $txt){
        if($line.Length -ge 256){ #讀到的這一行超過256個字元才執行
            $top256 = $line.Substring(0,256)
            $a1011= $line.substring(9,2) # 從0開始算
            $a19 = $line.substring(18,1)
            $a25 = $line.substring(24,1)

            if($a1011 -eq "20" -and $a19 -eq "0" -and $a25 -eq "0" ){
                $total += $top256   # 結果加在一起(字串相加?)
            }        
        }
}
echo $total  # 印出

看更多先前的回應...收起先前的回應...

我還是建議用程式語言寫成CONSOLE APP,執行檔EXE看起來也比較"正式"一點,至少別人不太能輕易的看的到內容(遇到會反組譯的高手除外)

如果你想把結果回存到另一個文字檔,簡單,用跟批次檔一樣用重導向符號,加在我剛的PS1的最後一行即可

$total > 'newfile.txt' # 創造新檔或覆蓋舊檔
$total >> 'newfile2.txt' # 追加

從Win98就內建的Windows Script Host, 要直接執行, 要轉成EXE都OK.
不過我看不懂發文者的描述, 不就寫SAMPLE了.

narumi iT邦新手 5 級 ‧ 2019-07-24 09:30:54 檢舉

TO:japhenchen

不好意思,現在才回您。
經過小弟的多次實驗後發現BAT格式真的無法達成小弟想要的結果,所以目前已用別的語言製作完成了,感謝先進您的熱心協助。

0
tyudfg1682
iT邦新手 3 級 ‧ 2019-07-23 21:35:22

文字檔內容實在看不懂再寫什麼 /images/emoticon/emoticon06.gif

觀落陰文字檔開始

應該是說文字檔裡面全部都是連起來的看起來沒有排版

因為是別的程式丟出來的文字檔,所以它的資料內容都是連在一起的,需要換行的時候

才會出現換行符號,代表這邊之後的資料是換行的,然後雖然資料都連在一起顯示但是有些

欄位的資料還是會有空格做區隔排版,所以要連空格都算進去。


先從你希望的東西來看,來告訴你,你會撞到什麼鬼東西

1.固定取出長度256內的值,每取出256的值後就換讀下一條值。
2.遇到斷行符號則換行讀取至結束。
3.若由前開始算第11及第12位數為20且由後往前算第19位及第25位為零的話,將結果輸出。


1.取固定長度256的值,由於是文字所以很容易達成,就像你上面寫的利用For就可以了

2.遇到斷行符號就停止讀取(又要觀落陰了)

當你第一個條件在運作的時候,你的資料是一個字一個字丟出來的做0-256的資料整理的
你要怎麼判斷有沒有遇到換行符號? 某個連貫的文字出現=換行符號?(再用程式硬幹判斷?)

3.這個需求就更有趣了,我知道這在做什麼,想從一堆連貫的文字資料,找某個欄位的值
然後用那個值判斷之後決定要不要輸出某些東西
/images/emoticon/emoticon05.gif

以前我從CMD轉用Powershell之前第三個需求是我最想做的功能


如果我上面提的東西真的觀落陰對的話,去用Powershell吧,你會快很多

然後做2個需求跟第一個要顛倒過來做才對,先利用換行符號把資料切割好

讓資料跟著換行符號出現,落實真正的把資料做換行,再將每一行的資料

丟去給For迴圈,去取0-256資料出來

至於第三個需求,除非你每次0-256資料的欄位都是不會變化的

不然哪一天資料長度成長,你包準出事,例如本來這行資料只有0-99 兩位數

它成長到100之後資料開始變三位數,然後你的判斷式就出包了,

建議你還是將資料格式轉成CSV,從CSV的label去判斷這樣才可以省事。

至於利用換行符號把資料切割的方法,我這邊直接先給你,開一個Powershell

把下面範例貼上去敲Enter, -splist 左邊是來源資料 右邊是用來判斷切割的資料

"1 1 1,222,3 33,44 4" -split ","

"1 1 1022203 33044 4" -split "0"

至於CSV,自己找一下吧,再打下去我看要變專欄了

narumi iT邦新手 5 級 ‧ 2019-07-24 09:31:13 檢舉

不好意思,現在才回您。
經過小弟的多次實驗後發現BAT格式真的無法達成小弟想要的結果,所以目前已用別的語言製作完成了,感謝先進您的熱心協助。

我要發表回答

立即登入回答