各位先進,不好意思小弟又來打擾了。
因小弟要對一個文字檔的內容做分析,但一直無法取得有效的數值,想請各位先進幫幫忙指點一下小弟。
文字檔內容大意:
第一行例: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.讀取到空白時則後不會在輸出結果。
以上,求各位先進幫幫忙,萬分感謝!
用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 # 印出
文字檔內容實在看不懂再寫什麼
觀落陰文字檔開始
應該是說文字檔裡面全部都是連起來的看起來沒有排版
因為是別的程式丟出來的文字檔,所以它的資料內容都是連在一起的,需要換行的時候
才會出現換行符號,代表這邊之後的資料是換行的,然後雖然資料都連在一起顯示但是有些
欄位的資料還是會有空格做區隔排版,所以要連空格都算進去。
先從你希望的東西來看,來告訴你,你會撞到什麼鬼東西
1.固定取出長度256內的值,每取出256的值後就換讀下一條值。
2.遇到斷行符號則換行讀取至結束。
3.若由前開始算第11及第12位數為20且由後往前算第19位及第25位為零的話,將結果輸出。
1.取固定長度256的值,由於是文字所以很容易達成,就像你上面寫的利用For就可以了
2.遇到斷行符號就停止讀取(又要觀落陰了)
當你第一個條件在運作的時候,你的資料是一個字一個字丟出來的做0-256的資料整理的
你要怎麼判斷有沒有遇到換行符號? 某個連貫的文字出現=換行符號?(再用程式硬幹判斷?)
3.這個需求就更有趣了,我知道這在做什麼,想從一堆連貫的文字資料,找某個欄位的值
然後用那個值判斷之後決定要不要輸出某些東西
以前我從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,自己找一下吧,再打下去我看要變專欄了