perlでCSVファイルを読み込むスクリプトを作っています。
以下のようなCSVファイルがあります。
■CSVファイル
東京,よろしくお願いします。
大阪,はじめまして
九州,"5,000円でお願いします"
カンマで区切り、以下のようにすると、"5,000円"の部分が2つに分かれてしまいます。
($data1,$data2) = split(/,/,$all_data)
前後にダブルコーテーションがあった場合、中のカンマで区切らないような良い方法はないでしょうか?
環境:
Perl 5.8.5
No.3ベストアンサー
- 回答日時:
Text::ParseWords を使ってこんなのはどうですか。
(例ではparse_lineを使っています)もしquoteを残したければundefを1に変えてください。
use Text::ParseWords;
$" = "\t";
while (<DATA>) {
chomp;
my @words = &parse_line(',', undef, $_);
print "@words\n";
}
exit 0;
__DATA__
東京,よろしくお願いします。
大阪,はじめまして
九州,"5,000円でお願いします"
ありがとうございます。
この方法でできました。
ダブルコーテーション内のカンマで分割されることなく期待どおりの動作です。
助かりました。
No.4
- 回答日時:
CSV は、プログラミングの勉強ネタの宝庫だと思います。
" " で囲まれたセルは、「,」(カンマ) 以外でも以下の注意が必要です。勉強のために取り組んでみるのは良い事ですが、手っ取り早く実用に耐える物が欲しい場合は自分に合った仕様のモジュールを探す選択肢もありかと思います。
1 " が閉じない内に改行が来たら、それはテーブルとしての改行では無くセルに埋め込まれた改行文字。 あるバージョンの MSExcelは、テーブルとしての改行は CRLF、 セル内埋め込みは LF と使い分けるかも知れませんが、それを期待してはいけません。 (業界規格では、CSV中の改行は全て CRLF と規定されていたと思います)
2 " " で囲まれた中に "" (2個連続した")が現れたら、それはセルに埋め込まれた 1個の " です。
3 MS-Excel が 「1/2」を「1月2日」に変換するのを抑止する方法は、MS-Excel のバージョンにより違います。 例えば Excel2003 向には ="1/2" とか"=""1/2""" と書いたりします。 読み込むCSVの作成ソフトによってはそういう工夫が入っているかも知れません。
4 その他、MS-Excel が日付や数値と解釈するのが不都合なケースは結構あって、手作業やアプリケーションで作成されたCSVはそれらを文字列と認識させる為の工夫が入っているかも知れません。
ご親切にありがとうございます。
今回は、データの吐き出し元がJavaですので、大丈夫だと思います。
他の回答で紹介されたparse_lineを使用することにします。
今後の参考なります。ありがとうございました。
No.2
- 回答日時:
もうちょっとつめる必要があるけど
#!/usr/bin/perl
# -*- coding: utf8 -*
use strict;
use warnings;
use feature ':5.10';
while (my $line = <DATA>) {
chomp $line;
my @fields;
@fields = ($line =~ /([^",]* | "[^"]*") (?:,|$)/gx);
say join ' : ', @fields;
}
__END__
abc,大阪,はじめまして,xxx
def,九州,"5,000円でお願いします",yyy
結果:
abc : 大阪 : はじめまして : xxx :
def : 九州 : "5,000円でお願いします" : yyy :
Text::CSV って今でもマルチバイト文字が入るとき面倒があるんだっけか?
今回は、別の回答にあるparse_lineを使用することにします。
時間のあるときにお教えいただいた方法も勉強してみます。
回答、ありがとうございました。
No.1
- 回答日時:
いろいろ方法はあるようですが、とりあえず
ダブルクォート内のカンマを正規表現でマッチさせて一時的に置換して分割するのがいいらしいですね。
参考URL:http://home.kanto-gakuin.ac.jp/~ahero/perl/anywa …
この回答への補足
ありがとうございます。
なるほど。数字に挟まれたカンマを一時的に置き換えておくのですね。
せっかく回答いただいたのにすみません、
今回はデータがフリーコメントなので、前後が必ず数字であるというわけではないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Visual Basic(VBA) VBAで出力したCSVファイルの先頭にカンマを挿入したい 5 2022/10/14 12:20
- システム メールのcsv添付ファイルの種類を テキスト形式からカンマ区切り形式に 変更する方法はありますか? 4 2023/03/09 20:33
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Java javaのCSVデータ読込についてです 6 2022/07/02 10:58
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlでcsvファイルを読む(ダブ...
-
Perlの初心者です。2重ループ...
-
ディレクトリの判別
-
awkスクリプトでダブルクォーテ...
-
csvファイルの横方向への改行に...
-
FindFirstFileとFindNextFileで...
-
VBAでCSVファイルを途中行まで...
-
Perlで フォルダ内の全て...
-
batファイルでrenameができませ...
-
ファイルの存在の有無を確かめ...
-
エクセルVBAで素数だけを出力す...
-
バッチファイルの作り方(CSV→...
-
Perlの変数に文字数制限(容量...
-
openした後、closeしないでプロ...
-
オープンしたファイルで行の連結
-
ディレクトリ名を取得したい
-
ReadLineでの読み出し行を指定する
-
機器のI/OをArduinoでSDに記録...
-
教えて!perlから.exeファイル...
-
Perl で syntax error
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
perlでcsvファイルを読む(ダブ...
-
BBCode削除&改行をサニタイジ...
-
Perlで空白行を削除
-
Perlの初心者です。2重ループ...
-
MATLAB std::exceptionエラー
-
ファイルの3行目までを出力したい
-
perlでファイルの比較
-
pythonでの実績データの処理プ...
-
cgiのログの書き方
-
先頭の単語が一致した時のデー...
-
書き込み時に勝手にクリアさせ...
-
エラーチェック、ファイルに特...
-
Argument "\\\\n" isn't numeri...
-
CSVファイルのデータの行数を取...
-
perl:パターンマッチを使ったif...
-
Pythonでegrep機能をつかいたい
-
batファイルでrenameができませ...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
おすすめ情報