![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
都合のいい質問だと分かってて質問しています。
今、データの読み込みプログラムを作っています。
件数は12万件(11MB)です。
・データはCSV形式になっており、区切りはカンマです。
・"" で囲まれたカラムとそうでないカラムがあり、"" で囲まれたカラムの一部には、データとしてカンマが含まれていることがあります。
・また、データにはエスケープシーケンスを含むことが許されており、 \" という文字は囲み記号であると認識してはいけません。
このようなルールのとき、
@data = split( /,/, $line );
というロジックでは分割できませんよね。
なんで、物凄い複雑なロジックで分割を行う xsplit という独自の関数を作って分割しています。
ところが、1行ごとにこの xsplit を使用しなければならないため、データが12万件もあると、読み込みだけで15~18秒もかかってしまいます。( split だと3秒で終わります)
で、少しでもこの時間を縮めるために、上記のルールを崩さずに split の /,/ の部分を変更するだけで分割を行うことはできないもんでしょうか。
何か思いついた方がいらっしゃいましたら、よろしくお願いします。
(ちなみに拡張モジュール類などの、環境によって動いたり動かなかったりするような物は使えないということでお願いします)
No.3ベストアンサー
- 回答日時:
No.1 で紹介されたページのアルゴリズムは、エスケープシーケンスに対応していません。
これを対応させると以下のようになります。(ちょっと簡素化してます。)
chomp $line; # 改行が既に削除されていれば不要です。
@data = "$line," =~ /("[^"]*(?:\\"[^"]*)*"|[^,]*),/g;
$line の値が
ABC,"foo,bar","hoge=\"baz,123\"",\"ok?,:-)\"
だとすると、@data の要素は
ABC
"foo,bar"
"hoge=\"baz,123\""
\"ok?
:-)\"
となります。
また、要素に含まれる囲みクォートを削除し、\" を " に戻すには、
@data = map { s/^"(.*)"$/$1/; s/\\"/"/g; $_ }
"$line," =~ /("[^"]*(?:\\"[^"]*)*"|[^,]*),/g;
とします。すると @data の要素は
ABC
foo,bar
hoge="baz,123"
"ok?
:-)"
となります。
こちらの方法は、No.2 で紹介された Text::ParseWords を使った方法と同じ結果になりますので、ベンチマークを取って早かった方を使われるとよいでしょう。
No.2
- 回答日時:
Text::ParseWordsモジュールでできます。
例)
use Text::ParseWords;
@b=quotewords(",",0,"AAA,\"b\",cc");
p join("-",@b);
AAA-b-cc
以上です
No.1
- 回答日時:
要するに、
・データはCSV形式になっており、区切りはカンマです。
・"" で囲まれたカラムとそうでないカラムがあり、"" で囲まれたカラムの一部には、データとしてカンマが含まれていることがあります。
・また、データにはエスケープシーケンスを含むことが許されており、 \" という文字は囲み記号であると認識してはいけません。
を処理できる、正規表現があれば良いのですよね。ピッタリのものがあります。
http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
これを関数化すれば良いと思います。
参考URL:http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Java javaのCSVデータ読込についてです 6 2022/07/02 10:58
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルの中で、「 , 」カ...
-
EXCELからCSVにすると余計なカ...
-
エクセルで数値を全角文字(カ...
-
マクロを使ってフォルダー内に...
-
[VBA][Excel]クリップボードか...
-
カンマ区切りの数字をCSVフ...
-
C#で、テキストボックスの入力...
-
CSVの定義
-
カンマ区切り
-
数字が全角、コンマなし
-
エクセルの区切り位置の設定方法
-
メッセージボックスの数字をカ...
-
データグリッド内の数値をカン...
-
データにカンマが入ったCSVデー...
-
メールのcsv添付ファイルの種類...
-
WORDで改ページすると時々グレ...
-
VB2005のTextBoxでカン...
-
メモ帳からエクセルにセル区切...
-
PHP カンマをエスケープしたい...
-
何故、日本は未だに数字を3桁...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSVファイルの中で、「 , 」カ...
-
データにカンマが入ったCSVデー...
-
EXCELからCSVにすると余計なカ...
-
エクセルで数値を全角文字(カ...
-
マクロを使ってフォルダー内に...
-
カンマ区切りの数字をCSVフ...
-
WORDで改ページすると時々グレ...
-
CSVの定義
-
[VBA][Excel]クリップボードか...
-
カンマ区切り
-
ひとつの命令を複数行に記述
-
「カンマ」と「コンマ」は同じ...
-
VBAでtxtファイルを読み込む際...
-
何故、日本は未だに数字を3桁...
-
エクセルの区切り位置の設定方法
-
PHP カンマをエスケープしたい...
-
C#で、テキストボックスの入力...
-
海外のケータイ(GSM携帯)はハ...
-
3桁ごと?4桁ごと?コンマの...
-
openoffice calcで#DIV/0! の...
おすすめ情報