CSV形式にすると。。。

このQ&Aのポイント
  • CSV形式に変換するプログラムを作成しましたが、ダブルクォーテーションの処理で文字化けが発生しています。
  • ファイルを読み込みCSVカンマ区切りのデータにするプログラムを作ったのですが、ダブルクォーテーションを取得行の行末に付加した場合に文字化けを起こすケースがあります。
  • 「150」が「"15"」のようになってしまいます。どなたか、対処方法を教えてください。
回答を見る
  • ベストアンサー

CSV形式にすると。。。

ファイルを読み込みCSVカンマ区切りのデータにするプログラムを作ったのですが、 ダブルクォーテーションを取得行の行末に付加した場合に文字化けを起こすケースがあり、「150」が「"15"」等のようになってしまいます。  どなたか、分かる方がいましたらよろしくお願いします。 # ファイルのオープン open ( FILEIN , "$FName") || die "ファイルを開けません :$!\n"; @line = <FILEIN>; close (FILEIN); foreach $line (@line){ ##### 文字化け対策 ##### $line =~ s/ⅰ|ⅱ|ⅲ|ⅳ|ⅴ|ⅵ|ⅶ|ⅷ|ⅸ|ⅹ//g; $line =~ s/\"/\"\"/g; $line =~ s/\,\"\?/\"\,\"/g; $line =~ s/\"\,\?/\"\,\"/g; $line =~ s/\ |\ /\"\,\"/g; # sjis --> euc コードへ変換 &jcode::sjis2euc(\$line,"z"); if (length $line > 1){ $cd_22 = chr(0x0022); $line = "$cd_22$line"; $line =~ s/[^$1\n]$/\"/g; } } open (FILEOUT, ">./log/$file") or die; print FILEOUT @line; close (FILEOUT); }

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

直接の原因は > $line =~ s/[^$1\n]$/\"/g; ではないかと思います。 「$1」の値は「直前の正規表現で1番目のグループにマッチした文字列」ですが、このコードの中にグループ指定をした正規表現が見当たりません。 また、$1 を外したとしても、「\n 以外の末尾1文字」をダブルクォートに変換しようとしていますので、やはりうまくないような気がします。 元データの形式やCSV化の仕様などが分からないので、これ以上のアドバイスはちょっと難しいです。 もし解決できないようでしたら、その辺の補足をお願いします。

kaji_0131
質問者

お礼

leaz024さん回答どうもありがとうございました。 leaz024さんの回答を参考にして何とか解決することができました。 確かに言われてみれば、という奴でした^^;  具体的には、 > $line =~ s/\n$/\"/g; という感じで最後の改行コードを置換するようにしました。 本当にどうもありがとうございました。

関連するQ&A

  • foreachの入れ子について。

    あるディレクトリ内の全てのファイル名を取得し、 全てのファイルを開いてカンマ、ダブルクォーテーション付加の処理をし、 別ファイルへと出力する。と言ったものを以下のように作ったのですが、 入れ子のforeach{}内へ入って行きません、 foreachの入れ子は出来ないのでしょうか? それともプログラムが間違っているのでしょうか? どなたかご教授お願いいたします。 require "./jcode.pl"; # jcode.plの呼び出し #ディレクトリ表示 opendir(DIR01,"./TestData") || die "can not open dir"; @FileName = readdir(DIR01); closedir(DIR01) || die "can not close dir"; foreach $file (@FileName) { if ($file eq '.') {next;} # '.'の時ループを抜ける if ($file eq '..') {next;} # '..'の時ループを抜ける $FName = "./TestData/$file"; # ファイルのオープン open ( FILEHANDLE , "$FName") || die "ファイルを開けません :$!\n"; @line = <FILEIN>; close (FILEIN); foreach $line (@line){ ######################### print "TEST-->$line\n"; ######################### $line =~ s/ⅰ|ⅱ|ⅲ|ⅳ|ⅴ|ⅵ|ⅶ|ⅷ|ⅸ|ⅹ//g; $line =~ s/\"/\"\"/g; $line =~ s/\,\"\?/\"\,\"/g; $line =~ s/\"\,\?/\"\,\"/g; $line =~ s/\ |\ /\"\,\"/g; &jcode::sjis2euc(\$line,"z"); # sjis --> euc コードへ変換 if (length $line != 1){ chop($line); $cd_22 = chr(0x0022); $line = "$cd_22$line$cd_22"; $line =~ s/([^\LF])$/$1\n/; } } open (FILEOUT, ">./log/TEST.txt") or die; #上書き時 print FILEOUT @line; close (FILEOUT); } } exit;

    • ベストアンサー
    • Perl
  • 入力した値をファイルに出力するプログラム

    C++でscanfなどで入力した値をファイルに出力するプログラムを作りたいのですがうまくいきません。下記のプログラムを書いてみたのですが入力した値を出力することができませんでした。どこを変更すればいいのかわかる方がいましたらご指導よろしくお願いします。 #include<iostream> #include <fstream> using namespace std; int main( ) { char ch; char ss[10]; int dt; int i,p; ofstream fileout; // 出力用ストリームの宣言 ifstream filein; // 入力用ストリームの宣言 fileout.open("sampledata.txt"); // 出力ファイルをオープン if (!fileout) // エラー処理 { cout << "エラー!出力ファイルをオープンできません\n"; return 1; } printf("IDを入力してください:"); scanf("%s",i); printf("\nパスワードを入力してください:"); scanf("%s",p); printf("\n登録しました。"); fileout << "ID=%d PASS=%s\n",i,p; // 文字列データ出力 fileout.close(); // 出力ファイルをクローズ filein.open("sampledata.txt"); // 入力ファイルをオープン if (!filein) // エラー処理 { cout << "エラー!入力ファイルをオープンできません\n"; return 1; } filein >> ch; // 文字データ入力 filein >> ss; // 文字列データ入力 filein >> dt; // 数値データの入力 cout << ch << '\n'; cout << ss << '\n'; cout << dt << '\n'; filein.close(); // 出力ファイルをクローズ return 0; }

  • 文字化け対策

    sjisで保存されたファイルを読み込んで、別ファイルに書込みを行ったところ、能等の文字が文字化けを起こしました。 open(IN,"$file"); my $data = <IN>; close(IN); $data=~s/\\//g; open(OUT,">$file2"); print OUT $data; close(OUT); 莫大なソース量だったので、原因を探すのに時間がかかりましたが、一つ一つ消去しながら探したところ、 $data=~s/\\//g; これを消すことで解消しました。 文字化けさせずに\を消すにはどのように書けばいいのでしょうか?

    • ベストアンサー
    • Perl
  • 初心者で、困っています。(文字化け)

    すみません、すごく初歩的なことで困っています。 本を見ながら、下のようなものを書いたのですが、 出力すると、文字化けをしてしまいます。ウィンドウズの環境で、Perlは5.8を使い、読み込みのテキストはUnicodeです。どのようにすれば、文字化けをしないで、読み込めるのでしょうか。 open ( IN , "LBa3_00028.txt" ) or die; open ( out , ">out.txt" ); while ( $line = <IN>){ print out "$line\n"; } close(out); close(IN);

    • ベストアンサー
    • Perl
  • Jcode.pmでの半角カナ→全角カナ変換

    Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。 use Jcode; $euc_string = jcode($form_input)->h2z->euc; 原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。 use Jcode; $euc_string = jcode($form_input,"sjis")->h2z->euc; ただ、入力コードがシフトJISとは限りませんので、この記述は好ましくないと思っています。 半角カナの文字化けは、webフォームを作られた方なら皆さん経験されていると思うのですが、どうされているのでしょうか? Jcode.pmの文字コード判別は、半角カナが混じっていた場合、かなり長い文字列でないと判別に失敗するようなので、フォームで短い文字列(名前等)を入力させて処理させた場合、ほとんど上手く動かないようなのですが?

    • ベストアンサー
    • Perl
  • 文字化け(違う文字コードで保存すると不可逆?)

    テキスト・エディタでSJISのテキスト・ファイルをEUCとして開き(この時点で文字化けしてたのですが、それに気付かず)、誤ってそのまま保存してしまいました。 しかも大量のファイルを・・・。 日本語が文字化けしてしまったのですが、これを修復することはできるでしょうか? 一応、EUCのファイルをもう一度SJISで保存し直してみたり、エンコードを読み変えるソフトなどを試してみたのですが、結果はダメでした。 具体的には、以下の手順でやってしまいました。 1.秀丸でSJISファイル(PHPスクリプト)を開く 2.拡張子関連付け(PHPファイル=EUC)によって、開いた時はEUCモード(この時点で文字化け) 3.そのまま(EUCファイルとして)上書き保存 どなたか、修復の方法が分かる方、教えてください・・・・

  • Excelのcsv形式の読み込み

    Excelのcsv形式の読み込み 前回、http://okwave.jp/qa/q6018540.htmlで 質問させていただきましたJurassic_periodです。 お力を貸していただきました方々本当にありがとうございました。 今回ですが同じプログラムでまた壁にぶつかってしまいました。 どうかよろしくお願いいたします。 Excelのcsv形式の「file.csv」のようなデータを読み込んでいます。 「out.csv」のように出力したいのですが 未入力「""」のデータ箇所が多々ある事に気が付きました。 次データを読み込むため出力データがズレてしまい困っています。 「file.csv」 "2010/1/1","C","こんにちは","田中","end", "2009/10/2","B","おはよう","","end", "2007/3/20","E","Good mor ning","佐藤","end", "1988/8/16","","こんばんは","中 村","end", "","A","Hello","木村","end", "2005/9/17","D","おはようご ざいます","斎藤","end", 「out.csv」(このように出力したいです) C,こんにちは,田中,2010/1/1,end, B,おはよう, ,2009/10/2,end, E,Good morning,佐藤,2007/3/20,end, ,こんばんは,中村,1988/8/16,end, A,Hello,木村, ,end, D,おはようございます,斎藤,2005/9/17,end, 解決法として、正規表現を用いて「半角スペース」を入れようとしました。 また、直接「file.csv」の「,"",」を置換で「," ",」にしましたが 基データを操作するのは好ましくないのでプログラムで どうにか処理ができないでしょうか。 「今書いているプログラムです」 #!/usr/local/bin/perl use strict; use Fatal qw/ open /; my $csv_file = "file.csv"; my @csv; &readCsvFile($csv_file); open(OUT,">out.csv"); for(my $i=0; $i<=$#csv; $i++){ $csv[$i][0] =~ s/"//; #行頭の"を削除 $csv[$i][4] =~ s/"//; #行末の"を削除 $csv[$i][0] =~ s// /; #空データを半角スペースに置換 $csv[$i][1] =~ s// /; $csv[$i][3] =~ s// /; print OUT $csv[$i][1],","; print OUT $csv[$i][2],","; print OUT $csv[$i][3],","; print OUT $csv[$i][0],","; print OUT $csv[$i][4],",\n"; } close(OUT); sub readCsvFile { open(IN, $_[0]); my $line = ""; while(<IN>) { chomp; $line .= $_; next if $line !~ /end/; push @csv, [ grep { length } split(/","|",|"/, $line) ]; $line = ""; } close(IN); } どうか、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perlで半角カナを検索するには、どうしたらいいのでしょうか?

    perl初心者です。 下記のようなファイルがあったとします。 パナソニック(ナショナル) 三菱電機 日立 東芝 SONY 下記のように、書きました while (<IN>) { use Jcode; Jcode::convert($_, 'euc'); chomp; $line+=1; Jcode::convert($_, 'euc'); if ($_=~ /\x8E/) { print "行=$line $_\n"; } } できあがったファイルは、下記のように、半角カナではなく、字化け状態になってしまいました。 行=2 姉鰭電機 行=4 東芝 よろしくお願い致します。

  • jcodeコンバートさせた後の置換処理が無効になるのはなぜ

    jcodeコンバートさせた後の置換処理が無効になるのはなぜですか? foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); #jcode'convertの後ではNG------------# $value =~ s/://g; $value =~ s/,//g; } foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); #jcode'convertの前ならOK------------# $value =~ s/://g; $value =~ s/,//g; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); }

    • ベストアンサー
    • Perl
  • includeファイルの文字コードについて

    お世話になります。 PHPでのincludeファイルのことで考えています。 SJISコードで保存されたファイルを、EUCで書かれ ましたPHPプログラムで、文字化けをせずに読み込む 事は可能なのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP

専門家に質問してみよう