約1000行のCSVファイルがあります。これをインポートしようとすると、700行でエラーが発生します。ただし、このCSVのエントリには改行文字が含まれて引用されているため、awk
Quickなどを使用して行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
終わりに。
各行を正常に解析した後に印刷されます。バイトオフセット。
1行の解凍:
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の周りの参照は閉じられません。