2010-11-10 37 views
1

我有一個很大的文件,數以萬計的行包含數據分開|批量插入我的數據庫中。 我知道應該說10列。如何檢查csv文件中每一行的列數?

由於某些數據可能會意外地包含分隔符|,因爲此行的列數不匹配,可能會發生錯誤。

我想算有20多個欄目,以檢查該文件是有效的行數:

@ECHO OFF 
set /a count=0 
FOR /f "tokens=10,* delims=|" %%i in (%1) DO (
    if not "%%j"=="" (
    set /a count+=1 
) 
) 
echo %count% 
:eof 

它運作良好...但前提是沒有任何字段爲空,在這種情況下,計數轉移,因爲delims處理諸如空格

e.g 
    1|2|3|4|5|6|7|8|9|10 => cool, 10 columns 
    1|2|3|4|5|6|7|8|almost got|you|10 => found 11 columns 
    1|2|3|4||6|7|8|got|you|10 => damn, reports as 10 columns 

我怎樣才能解決這個問題只使用命令行/ Windows批處理分隔符?

N.B.我無法修改文件以將數據封裝在引號或其他內容中。

回答

1

您可以使用findstr並給它一個正則表達式。假設你知道你的行至少有10列,這意味着它至少有9個管道字符。你想找到哪些線有10個或更多管道字符。我們可以想出這個正則表達式:

.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.* Line has at least 10 pipe characters, meaning 
            some data field contains a pipe character. 

給那個正則表達式來findstr

findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt 

這將打印所有格式不正確的行。給出find /c的輸出來計算它吐出的行數。

findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt | find /c "|" 

data.txt

1|2|3|4|5|6|7|8|9|10     good - 10 columns 
1|2|3|4|5|6|7|8|almost got|you|10 bad - 11 columns 
1|2|3|4||6|7|8|got|you|10   bad - 11 columns 
1|2|3|4|5|6|7|8|9||     bad - 11 columns 
1|2|3|4|5|6|7|8|9     good - 10 columns 
1|2|3|4|5|6|7      gotcha - less than 10 columns not detected 
1|2|3|4|5|6|7|8|9|     good - 10 columns 
|||||||||       good - 10 columns 
||||||||||       bad - 11 columns 

C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt 
1|2|3|4|5|6|7|8|almost got|you|10 bad - 11 columns 
1|2|3|4||6|7|8|got|you|10   bad - 11 columns 
1|2|3|4|5|6|7|8|9||     bad - 11 columns 
||||||||||       bad - 11 columns 

C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt | find /c "|" 
4 
+0

大,甚至不知道FINDSTR存在 – hoang 2010-11-12 10:01:45

相關問題