2012-11-23 13 views
5

私はcsvファイルに基づいて画像を一括して名前を変更してコピーするスクリプトを作成しています。 csvは、列1:古い名前と列2:新しい名前で構成されます。私はcsvファイルをperlスクリプトの入力として使用して古い名前をチェックし、新しい名前を使って新しいフォルダにコピーを作成します。 (私が思う)問題は、画像と関係があります。私は、スクリプトを実行すると、彼らはßなどのようなUTF8文字が含まれているそれは、このプリントアウト:それはBarfußgässchenあるべきBarfu├ƒg├ñsschenと、次のエラー:csvファイルを使用してutf8の名前で画像をコピー/名前を変更します

Unsuccessful stat on filename containing newline at C:/Perl64/lib/File/Copy.pm line 148, <$INFILE> line 1. 
Copy failed: No such file or directory at X:\Script directory\correction.pl line 26, <$INFILE> line 1. 

は、私はそれがBINMODEのUTF8に関係しています知っているが、私は簡単なスクリプトを試してみても、(ここではそれを見た:How can I output UTF-8 from Perl?):エアース÷sが

これは私のスクリプト全体で、誰かが私に説明することができ、私は行くよどこ:

use strict; 
use utf8; 
my $str = 'Çirçös'; 
binmode(STDOUT, ":utf8"); 
print "$str\n"; 

それはこのプリントアウト違う? (私はものをテストしていたのでコードの最もクリーンではない)。

use strict; 
use warnings; 
use File::Copy; 
use utf8; 

my $inputfile = shift || die "give input!\n"; 
#my $outputfile = shift || die "Give output!\n"; 

open my $INFILE, '<', $inputfile or die "In use/not found :$!\n"; 
#open my $OUTFILE, '>', $outputfile or die "In use/not found :$!\n"; 

binmode($INFILE, ":encoding(utf8)"); 

#binmode($OUTFILE, ":encoding(utf8)"); 

while (<$INFILE>) { 
s/"//g; 
my @elements = split /;/, $_; 

my $old = $elements[1]; 
my $new = "new/$elements[3]"; 
binmode STDOUT, ':utf8'; 
print "$old | $new\n"; 

copy("$old","$new") or die "Copy failed: $!"; 
#copy("Copy.pm",\*STDOUT); 

# my $output_line = join(";", @elements); 
# print $OUTFILE $output_line; 
#print "\n" 
} 

close $INFILE; 
#close $OUTFILE; 

exit 0; 
+0

最初のスニペットについて:.plファイル自体がutf8でエンコードされていますか? 'use utf8'プラグマはあなたのソースコードがutf8で書かれていることをPerlに伝えます。データには関係しません。 – simbabque

+0

出力先はどこに印刷されていますか? Linuxシェル?また、どのようにファイルを作成していますか? –

+0

LANGが 'en_GB.UTF-8'に設定され、パテがUTF-8に設定された状態で、Linuxシェルで最初のスニペットが正常に動作することを確認できます。同じシェルにVIMを使ってファイルを作成しました。 –

答えて

3

プロセスのすべてのステップがUTF-8を使用していることを確認する必要があります。

入力CSVを作成する際には、好ましくはBOMなしでUTF-8として保存されていることを確認する必要があります。 Windows NotepadはBOMを追加しますので、Notepad ++を試してみてください。エンコードをより詳細に制御できます。

また、WindowsコンソールがデフォルトでUTF-8に準拠していないという問題もあります。 Unicode characters in Windows command line - how?を参照してください。コードページをchcp 65001に設定するか、STDOUTエンコーディングを変更しないでください。

コードに関しては、新しい行に関する最初のエラーは、おそらくCSVの末尾に新しい行があるためです。 How do you create unicode file names in Windows using PerlWhat is the universal way to use file I/O API with unicode filenames?を参照してください - 「アドレス」にあなたが正しいロケールにあなたのファイル名をエンコードするために必要なファイルを

chomp()

while (<$INFILE>) {後にアップデートを追加します。

open my $INFILE, '<', encode("cp1252", $inputfile) 

がアップデート2:

また

copy(encode("cp1252", $old), encode("cp1252", $new)) 

、開いても、ファイル名をエンコードする必要があります:あなたは西洋1252 /ラテンを使用していると仮定すると、これはあなたのコピーコマンドは次のようになりますとき意味します

DOSウィンドウで実行しているときは、binmode(STDOUT, ":utf8");を削除し、デフォルトのコードページをそのままにしておきます。

+0

私はメモ帳で++をutf8としてBOMなしで作成しました。私は今すぐ私に与えた他の2つの提案をチェックしています。 – Jan

+0

while(<$INFILE>){'の後に' chomp; 'を追加すると、最初のエラーのトリックが実行されました。コードページを最初に設定してからもう一度スクリプトを試しても何も変わりません。私はまだメッセージのコピーに失敗しました。古い名前と新しい名前が表示され、古い名前が間違っていて、実際のファイルと一致せず、失敗することがわかります – Jan

+0

update re:filename encodingを参照してください –

関連する問題