불필요한 공백 없이 CSV 파일을 만드는 방법은 무엇입니까? [폐쇄]

불필요한 공백 없이 CSV 파일을 만드는 방법은 무엇입니까? [폐쇄]

나는 xls2csvRed Hat Linux 컴퓨터에서 XLS 문서를 CSV로 변환하기 위해 이 바이너리를 사용하고 있습니다.

예: (맨 페이지에서):

 xls2csv -x "1252spreadsheet.xls" -b WINDOWS-1252 -c "ut8csvfile.csv" -a UTF-8

그러나 Bash 스크립트에 문제를 일으키는 다음 사항이 있음을 발견했습니다.

  1. CSV 출력에 불필요한 공백(단어 왼쪽 또는 단어 오른쪽)이 포함되어 있습니다.

    CSV의 잘못된 구문 예:

     ,"/var/adm/sys ldd/all  /Comm/logs   ","WORD "," WORD"
    

    CSV의 올바른 구문 예:

     ,"/var/adm/sys ldd/all  /Comm/logs",WORD,WORD
    
  2. 필요하지 않은 경우 견적이 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"

관련 정보