2012-01-21 6 views
4

Powershell에서 EXPORT-CSV를 사용하여 CSV를 생성 한 다음 Perl 스크립트로 보내고 있습니다. 그러나 Perl은 파일을 가져올 수 없습니다.CSV 형식이 올바르지 않습니까?

CSV 파일이 작동중인 버전 (동일한 Perl 스크립트에서 가져온 것으로 powershell이 ​​아닌)에서 확인되었으며 차이점이 없습니다. coloumns는 excactly 동일하고 둘 다 구분 기호로 세미콜론을 가지고 있습니다. 그러나 Excel에서 파일을 열면 모든 항목이 각 줄의 첫 번째 셀에서 끝납니다 (즉, 텍스트에서 색상으로 작업해야 함). 작업 파일은 시작과 다른 셀로 끝납니다.

메모장에서 파일을 열었을 때 내용을 새 파일로 복사/붙여 넣기하면 가져 오기가 작동합니다!

그래서 나는 무엇을 놓치고 있습니까? 메모장에서 볼 수없는 "숨겨진"속성이 있습니까? 인코딩 유형을 변경해야합니까?

도와주세요 :)

+0

모듈 (예 : Text :: CSV)을 사용하고 있습니까, 아니면 CSV 파일을 직접 파싱하고 있습니까? 강력하게 테스트 한 모듈을 사용하는 것이 좋습니다. – dgw

+1

Powershell에서 사용하는 정확한 명령은 무엇입니까? 당신이하고있는 말만하지 마라. – manojlds

+0

nConf 소프트웨어와 함께 제공되는 가져 오기 스크립트를 사용하고 있습니다. 나는 그것이 Text :: CSV에 근거한다고 생각한다. 나는 지금 마노 (Mano)의 글에 앞섰지 만, 나는 곧 내가 정확한 명령을 게시 할 것이다. 고맙습니다! – Sune

답변

6

CSV 파일을 더 자세히 보려면 ​​Notepad++을 사용해보세요. 이렇게하면 상태 표시 줄의 파일 인코딩을 알 수 있습니다. 숨겨진 문자도 켜십시오 (보기> 기호 표시> 모든 문자 표시). 줄 바꿈이나 캐리지 리턴 + 줄 바꿈, 탭 대 스페이스 등이 표시됩니다. 인코딩 메뉴에서 파일 인코딩을 변경할 수도 있습니다. 이렇게하면 차이점을 파악하는 데 도움이 될 수 있습니다. 메모장에는이 정보가 표시되지 않습니다.

$allText = [IO.File]::ReadAllText("C:\test.csv") -replace "`r`n?", "`n" 
$encoding = New-Object System.Text.ASCIIEncoding  
[IO.File]::WriteAllText("C:\test2.csv", $allText, $encoding) 

또는 메모장 ++ (편집> EOL 변환> 유닉스 형식)를 사용할 수 있습니다 : -

는 업데이트 여기에 코드에서 유닉스 형식으로 윈도우에서 텍스트 파일을 변환하는 방법은 다음과 같습니다.

는 는
+0

이것은 환상적인 팁이었습니다! 나는 당신의 설명에 따라 파일을 열었고, 필자의 부러진 버전은 각 라인의 끝 부분에 CR LF가 있었고 작업중인 사람은 LF 만 가지고 있었다. 나는이 문제에 대해 읽었으며, 이것이 win/unix 유형 파일과 관련이 있다는 것을 알고있다. 하지만 CR을 제거하려면 어떻게해야합니까? 또는 export-csv를 사용하여 다른 인코딩으로 파일을 내 보내야합니까? (Utf-8과 표준을 모두 시도했다.) – Sune

+1

@Sune CR + LF는 Windows 방식이다. Unix에서만 LF가 필요하기 때문에 펄 스크립트가 유닉스 세계에서 살아갈 것으로 예상된다. 우리는 파일을 변환 할 수 있습니다. 업데이트 된 답변을 확인하십시오. –

+0

일반적으로 파일을 변환 할 필요는 없습니다. Perl이 읽는 방법을 바꾸십시오. –

0

Excel에서 .CSV 형식으로 저장 한 파일이 실제로 쉼표로 구분 있다고 가정하는 경향이있다. 그러나 세미콜론을 사용하고있는 것 같습니다. 쉼표로 전환 해 보거나 옵션이 아니면 확장자를 .txt로 변경해보십시오. Excel은 이전 작업을 수행하는 경우이를 자동으로 인식하지만, 후자는 파일을로드 할 때 가져 오기 마법사를 통해 사용자를 안내합니다. CPAN Text::CSV에서

+0

Michael, 감사합니다.하지만 Perl에서 파일을 처리 할 것이고 디버깅 목적으로 내용을보기 위해 Excel을 사용하기 만합니다. – Sune

1

:

use Text::CSV; 

my @rows; 
my $csv = Text::CSV->new ({ binary => 1 }) # should set binary attribute. 
      or die "Cannot use CSV: ".Text::CSV->error_diag(); 

open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!"; 
while (my $row = $csv->getline($fh)) { 
    $row->[2] =~ m/pattern/ or next; # 3rd field should match 
    push @rows, $row; 
} 
$csv->eof or $csv->error_diag(); 
close $fh; 

결코 CSV를 직접 구문 분석하려고 먼저 눈에 쉽게 보이지만에 해당하는 깊은 구덩이가 많이 있습니다. 당신이 일반적으로 잘되어야 기본값은 ASCII입니다 export-csv

를 사용하지만, Export-CSV 명령에 -Encoding UTF8을 설정하려고 할 때

+0

필자는 Csv를 가져 오는 perl 스크립트를 작성하지 않았으며, 내보내기 스크립트 (powershell) 만 작성했습니다. 가져 오기 스크립트는 nConf 소프트웨어 패키지와 함께 제공됩니다. 어쩌면 내가 여기서 뭔가를 놓치고있다.하지만 당신의 대답이 문제에 대한 해결책을 제공했다면 나는 확신 할 수 없다. – Sune

+1

@Sune 당신은 원래의 글에서 이것을 언급하지 않았습니다. 내 게시판에서는 펄 스크립트를 편집 할 수 있다고 가정합니다. – dgw

2

IT는 인코딩 문제 일 수 있습니다.

+0

나는 둘 다 시도했다! – Sune

+0

그래서 성공하지 못했습니까? 아니면? – Tom

+0

아니요, 성공하지 못했습니다. 해결책은 CSV에서 CR을 제거하는 것이 었습니다. (위 답변을 참조하십시오) – Sune

0

은 다른 게시물을 통해 발견 된 것을 감안할 때, 나는 가장 좋은 건 생각에 :

  1. 보내기 (유닉스 Y 캐리지 리턴이 아닌 윈도우를 사용)를 CSV 문자열로 변환하는 파일에 인코딩이 ASCII가 아닌지 확인하십시오.
    $str = $object | convertto-csv -notypeinformation | foreach-object { $_ -replace "`"","" } # 
    

    foreach-object


convertto-csv가 추가하는 추가 따옴표를 제거하는 해킹입니다. 데이터에 큰 따옴표가 있으면 선택 항목을 살펴 봐야합니다.

$str | out-file -filepath "path\to\newcsv" -encoding UTF8 
관련 문제