我有一個大約 1000 行的 CSV 文件,在我應該導入它的地方,我在第 700 行收到錯誤awk
。類似的方式顯示第700 行是什麼。
所以我發現有沒有強大的命令列工具來處理 csv 檔案?,並安裝了csvfix
和csvkit
;然而,這些應用程式似乎都不支援簡單地指定行號(或行範圍)並輸出它們。例如:
$ csvfix help echo
echo input CSV data to output
usage: csvfix echo [flags] [file ...]
where flags are:
-ibl ignore blank input lines
-sep s specify CSV field separator character
-rsep s as for -sep but retain separator on output
-osep s specifies output separator
-hdr s write the string s out as a header record
-ifn ignore field name record
-smq use smart quotes on output
-sqf fields specify fields that must be quoted
-o file write output to file rather than standard output
-skip t if test t is true, do not process or output record
我以為echo
這就是我所需要的,只要我可以指定要回顯的行,但是當我查看http://neilb.bitbucket.org/csvfix/manual/csvfix16/csvfix.html?unique.html,僅描述列。
我該如何使用這些工具(或其他工具)將 1000 行 CSV 中的第 700 行(或第 702-705 行)簡單地轉儲到標準輸出?
編輯:找到(http://neilb.bitbucket.org/csvfix/manual/csvfix16/ExpressionLanguage.html)csvfix
具有:
csvfix find -if '$line == 407' data.csv
……但是,這確實是行號而不是行號;因此,如果該行從第 406 行開始,然後中斷到第 407 行,並在第 407 行結束;那麼上面的命令將不會輸出任何內容 - 但如果您返回一行,-if '$line == 406'
則該行將被轉儲。這也很有用,但仍然不是行號...
答案1
csvfixfind
指令確實支援按範圍或數字轉儲行。以下命令將從名為 file.csv 的檔案中提取第 3 行和第 4 行。
csvfix find -if '$line >= 3 && $line < 5' file.csv
答案2
您可以暫時刪除所有引用的換行符,以便能夠使用普通文字工具並重新新增換行符。
例如,如果雙引號:
gawk -v RS='"' 'NR % 2 == 0 { gsub(/\n/, "%NEWLINE%") } { printf("%s%s", $0, RT) }' file.csv > tmp.csv
head -n 700 tmp.csv | sed 's/%NEWLINE%/\n/g' > file_1-700.csv
答案3
您可以像這樣從 perl 的 Text::CSV_XS 中取得位置:
perl -MText::CSV_XS -E 'open(my $fh, "<:encoding(utf8)", $ARGV[0]) or die "open: $!"; $csv = Text::CSV_XS->new({binary => 1, auto_diag => 9, diag_verbose => 1 } ); while (my $row = $csv->getline($fh)) { say tell $fh }' FILENAME.csv
請注意FILENAME.csv
該行末尾的 。
成功解析每一行後,它將列印位元組抵消。
拆開單線包裝:
use Text::CSV_XS;
use feature 'say';
open(my $fh, '<:encoding(utf8)', $ARGV[0]) or die "open: $!";
$csv = 'Text::CSV_XS'->new({'binary' => 1, 'auto_diag' => 9, 'diag_verbose' => 1});
while (my $row = $csv->getline($fh)) {
say tell $fh
}
我給它提供了這個錯誤的 CSS ( new.css
):
r1c1,"r1
c2",r1c3
r2c1,"r2c2,r2c3
r3c1,r3c2,r3c3
輸出:
18
# CSV_XS ERROR: 2027 - EIQ - Quoted field not terminated @ rec 1 pos 15 field 2
(如果在損壞的行之前有更多的好行,則會列印更多的位元組偏移量。使用最後一行。)
所以在位元組18之後,它發現了一個錯誤。很容易從中獲得行號:head -c 18 new.csv | wc -l
,其中表示 2(好行數)。所以錯誤出現在第 3 行——確實如此,r2c2 周圍的引用沒有關閉。