私はxls2csv
Red Hat LinuxコンピュータでXLSドキュメントをCSVに変換するためにこのバイナリを使用しています。
例:(マンページから):
xls2csv -x "1252spreadsheet.xls" -b WINDOWS-1252 -c "ut8csvfile.csv" -a UTF-8
しかし、Bashスクリプトに問題を引き起こす次のことがあることがわかりました。
CSV出力に不要なスペース(単語の左側または単語の右側)が含まれています。
CSVの無効な構文の例:
,"/var/adm/sys ldd/all /Comm/logs ","WORD "," WORD"
CSVの正しい構文の例:
,"/var/adm/sys ldd/all /Comm/logs",WORD,WORD
必要でない場合、見積もりはCSVとして表示されます。
CSVの無効な構文の例:
," WORD ",
CSVの正しい構文例
,WORD,
「きれいな」CSVファイルを生成するために出力をどのように変更しますか?
私はawk / sed / perl onelinerまたはBashスクリプトで動作する他のソリューションを探しています。
修復前のCSVファイルの例:
1,"/var/adm/sys ldd/all /Comm/logs",34356,"234245 ",24245
2,"/var/adm/sys ldd/all
/Comm/debugs.txt"," 45356",435," 578 58976 "
3," add this line in crontab :",34356,"234245 ",24245
4,"1.0348 54 35.5"," 45356"," 435","578 "
4,"1 2 "," 45356 95857 "," 435","578 "
5,"1 2 "," 45356 95857 "," "435","578" "
6,"1.0348 54 35.5"," 45356"," "4""" ""35","578 "
7,"1.0348 54 35.5",""45356",""4"""""35,"578 "
修正されたCSVファイルの例(修理後):
1,"/var/adm/sys ldd/all /Comm/logs",34356,234245,24245
2,"/var/adm/sys ldd/all
/Comm/debugs.txt",45356,435,"578 58976"
3,"add this line in crontab :",34356,234245,24245
4,"1.0348 54 35.5",45356,435,578
4,"1 2","45356 95857",435,578
5,"1 2","45356 95857","435,578"
6,"1.0348 54 35.5",45356,"4""" ""35,578
7,"1.0348 54 35.5",""45356",""4"""""35,578
そのフィールドにはカンマは使用できません。
フィールドに含まれる明示的な改行を参照してくださいline 2
。
フィールドが二重引用符内にあり、スペースが含まれていない場合(たとえば、行7 ""45356"
)、これらの二重引用符を含むフィールド全体がエンコードされたパスワードであるため、これらの二重引用符を削除しないでください。
答え1
このPerlコードは、ほぼ正確に予想される出力を生成します。
use Text::CSV;
my $csv = Text::CSV->new({ binary => 1, eol => $/, allow_loose_quotes => 1, escape_char => undef });
open my $io, "<", $ARGV[0] or die;
while (my $row = $csv->getline ($io)) {
my @o = map { $_ =~ s,^\s*,,; $_ =~ s,\s*$,,; $_; } @{$row};
$csv->print(STDOUT, \@o);
}
出力は次のとおりです
1,"/var/adm/sys ldd/all /Comm/logs",34356,234245,24245
2,"/var/adm/sys ldd/all
/Comm/debugs.txt",45356,435,"578 58976"
3,"add this line in crontab :",34356,234245,24245
4,"1.0348 54 35.5",45356,435,578
4,"1 2","45356 95857",435,578
5,"1 2","45356 95857",""435","578""
6,"1.0348 54 35.5",45356,""4""" ""35",578
7,"1.0348 54 35.5",""45356",""4"""""35,"578"