2012-01-21 25 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に基づいていると信じています。私は今すぐ私のコードの前にいませんが、すぐに私は正確なコマンドを投稿します。ありがとうございました! – Sune

答えて

6

あなたのCSVファイルをよく見たい場合は、Notepad++を試してみてください。これにより、ステータスバーのファイルエンコーディングが表示されます。隠し文字をオンにします([表示]> [記号を表示]> [すべての文字を表示])もオンにします。これにより、改行、改行+改行、タブ、スペースなどが表示されます。エンコードメニューからファイルのエンコードを変更することもできます。これは違いを特定するのに役立ちます。メモ帳にはこの情報は表示されません。

更新 - ここでのコードでのUnix形式へのWindowsからテキストファイルを変換する方法は次のとおりです。

$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変換> UNIX形式)を使用することができます。

+0

これは素晴らしいヒントでした!私は実際にあなたの説明ごとにファイルを開いていたと確信して、私の壊れたバージョンは、各行の終わりにCR LFを持っていたと働いていたのはLFだけだった。私はこの問題を読んできましたが、これはwin/unixタイプのファイルと関係があることを理解しています。 CRを削除するにはどうすればよいですか?または、export-csvを使用して別のエンコードでファイルをエクスポートする必要がありますか? (Utf-8と標準の両方を試してみた) – Sune

+1

@Sune CR + LFはWindowsのやり方で、UnixではLFだけが必要なので、PerlスクリプトがUnixの世界に住むことを期待しているように聞こえる。私たちはファイルを変換することができます。私の更新された答えをチェックしてください。 –

+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あなたは元の投稿にこれを言及していませんでした。私の投稿では、perlスクリプトを編集できると仮定しています。 – dgw

2

それはエンコードの問題である可能性があります。

+0

私は両方を試みました! – Sune

+0

あなたは成功しなかったのですか?それともあなたですか? – Tom

+0

いいえ、私は成功しませんでした。解決策は、CSVからCRを削除することでした。 (上の答えを参照) – Sune

0

他の記事で発見されたものを考えると、私はにあなたの最善の策だと思います:

  1. (というのWindowsよりもUNIX-Yキャリッジリターンを使用する)CSV形式の文字列に変換し送信することファイルに、エンコーディングがASCIIでないことを確認します。

$str = $object | convertto-csv -notypeinformation | foreach-object { $_ -replace "`"","" } # 

foreach-objectconvertto-csvが追加、余分な引用符を削除するハックです。データが二重引用符で囲まれている場合は、代替案を見る必要があります。

$str | out-file -filepath "path\to\newcsv" -encoding UTF8 
関連する問題