나는 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"