• ベストアンサー

CSVからのデータの取り出し

困ってしまいました。助けてください。 CSVからデータを取りだす事が出来たのですが、 データに値段が入っているため、カンマ切りで失敗してしまいます。 FNAME,LNAME,"12,400",0,0,0,"2,400","3,800" 料金が三ケタ目にカンマを打つので、それで、 split(/,/, $data); でデータを分裂させるとおかしくなってしまいます。 正規表現でヒットさせて置換などを使いたいのですが、分からず。 データ自体をいじるのはNGです。 ""の間の,が取れれば良いのですが。 値段表示に,はいりません。取ってしまいたいのですが。 助けてください。

  • Perl
  • 回答数4
  • ありがとう数0

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

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.4

こんちは $data = q{FNAME,LNAME,"12,400",0,0,0,"2,400","3,800"}; @a = map {s/[",]//g;$_} $data =~ /(\"[^"]+\"|[^,]+)(?:,|$)/g; print join(" - ", @a);

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

Text::CSV を使う。 それがいやならこんな感じで。 #!/usr/bin/perl use strict; use warnings; while (my $line = <DATA>) { chomp $line; my @f = $line =~ m/\G([^,"]+|"[^"]+"|),?/g; pop @f unless $line =~ m/,$/; print join(':', @f), "\n"; } __END__ FNAME,LNAME,"12,400",0,0,0,"2,400","3,800" FNAME,LNAME,"456,312,400",,,,"2,400","3,800" FNAME,LNAME,"456,312,400",,,,"2,400","3,800", 実行結果 FNAME:LNAME:"12,400":0:0:0:"2,400":"3,800" FNAME:LNAME:"456,312,400"::::"2,400":"3,800" FNAME:LNAME:"456,312,400"::::"2,400":"3,800":

  • auty
  • ベストアンサー率58% (284/486)
回答No.2

訂正 ・ JavaScriptの書式で恐縮ですが、""の中のカンマと""を先に取り出します。   さらに、100万未満と仮定します。 ss = 'FNAME,LNAME,"12,400",0,0,0,"2,400","3,800"'; ss2= ss.replace(/\"([0-9]{0,3}),?(\d{1,3})\"/g,"$1$2"); alert(ss2); 結果 ------------------------------------------------------------ FNAME,LNAME,12400,0,0,0,2400,3800

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

カンマのみですが、 ・ 「先読み言明」というのが使えませんか。 直後に数字でないものが続くカンマ split(/,(?=[^0-9])/)

関連するQ&A

  • csvカンマ区切りデータの特定列を置換したい

    csvカンマ区切りデータの数百列のうち特定データに固定長文字列を入力したいのですが、 正規表現機能を使って文字列置換する方法が知りたいのです。 たとえば、  111, 2, 33,以降省略・・・,100 を  111,="02",="033",以降省略・・・,100 と言った様に置換したいのです。100は仮ですので入力が省けれれば省きたいです。 上記の場合は、2列目を2桁の文字列、3列目を3桁の文字列として入力する場合です。 以上、よろしくお願いします。

  • カンマ付のCSVデータを処理

    サーバーに置いているCSVファイルのデータを 読み込みたいのですが、以下のようにカンマ付データ となっているため、splitだけでは上手く取得出来ません。 --------------------------------- "17577","SRK","",30,"","123" "17578","T,KMM","",50,"","123" --------------------------------- どうすればよいでしょうか?

  • csvファイルのデータ列数を取得したいのですがうまくいきません。

    csvファイルのデータ列数を取得したいのですがうまくいきません。 VB2010、StreamReaderでファイルを読み込み、 以下のコードで列数を取得してみたのですが、 数値変数の「列数」に7が入ります。 実際は3列しかありません。 SR.ReadLine()で読み込んだデータ右端部にいらないカンマがいくつか並んでいました。 列数 = UBound(Split(SR.ReadLine(), ",")) どう修正したらよいでしょうか。 また、csvファイルのデータ列数を簡単に取得する方法はないでしょうか? 教えてください。 お手数をおかけしますがよろしくお願いします。

  • perlでcsvファイルを読む(ダブルコーテーション内カンマを無視したい)

    perlでCSVファイルを読み込むスクリプトを作っています。 以下のようなCSVファイルがあります。 ■CSVファイル 東京,よろしくお願いします。 大阪,はじめまして 九州,"5,000円でお願いします" カンマで区切り、以下のようにすると、"5,000円"の部分が2つに分かれてしまいます。 ($data1,$data2) = split(/,/,$all_data) 前後にダブルコーテーションがあった場合、中のカンマで区切らないような良い方法はないでしょうか? 環境: Perl 5.8.5

    • ベストアンサー
    • Perl
  • 引用符がある、またはないCSVファイルをExcelマクロで開くには?

    カンマ区切りの複数のCSVファイルがあります。 ファイルによって、引用符がダブルクォーテーションであるものと、引用符がないものがあります。 1つのファイルの中では、引用符は統一されています。 この複数のCSVファイルをマクロで1つのExcelファイルにまとめたいと思います。 そこで、CSVファイルを一つ一つExcelで開いて、データをコピー&ペーストしたいのですが、 引用符の違いによって分岐させる処理がうまく動きません。 分岐処理は下記のようにしました。 アドバイスをお願いいたします。 On Error GoTo err1 Workbooks.OpenText Filename:=myPath & fname, Comma:=True err1: Workbooks.OpenText Filename:=myPath & fname, textqualifier:=xlTextQualifierNone, Comma:=True

  • CSVを「,」区切りでわける方法について

    PHPのプログラムで以下のようなCSVを「,」区切りで分解する方法を教えてください。 山田,太郎,"123,000",鈴木,康嗣 ← CSVの1行(サンプル) 上記のCSVを「,」区切りで以下のように区切りたいと思っています。 山田 太郎 123,000 鈴木 康嗣  しかし普通に分解すると「123,000」も「123」と「000」に分解されてしまいます。 「123,000」は、金額を表すのでここだけは、分解したくないのです。  なんとなく正規表現でできそうな気がするのですが、勉強があまりできてないせいか、 よく分かりません。どのようにすればいいのでしょうか?よろしくお願いいたします。  使用する関数は、「preg_split()」、「split()」、「preg_match()」を使って作ろうとしています。

    • ベストアンサー
    • PHP
  • csvファイルでの,(カンマ)の取扱について

    csvファイルをperlで取扱っています。 ,(カンマ)が含まれるデータは""で括ってやれば行がずれることなく入るのは分かっているのですが、今度は取り出すときどのようにしていいのか分かりません。 各行毎に一連のデータが羅列されていますが、それの分割方法を教えてください。 たとえば、 $bに,(カンマ)入りの文字列が入っていた場合、 ($a, $b, $c) = split(/,/, $query); とすると本来$bに入って欲しいデータの,(カンマ)から後の部分が$cに格納されてしまいます。(そこから先が1つずれます) これをずれずに分割させるにはどのようにしたらいいでしょうか? ちなみに ($a, "$b", $c) = split(/,/, $query); と試しにやってみましたが、エラーになってしまいました。 実は長年の悩みで、データを格納する際に,(カンマ)を別のあり得ないような文字列に置き換えて、取り出したあと,(カンマ)に戻すというやり方でやっていたのですが、1つのデータファイルを複数のperlで取扱うようになり、対応が難しくなってきたので、これを機にきちんとした方法でデータを取扱いたいと思っています。

    • ベストアンサー
    • Perl
  • PHP+MySQL でのcsvファイルインポート

    PHP + MySQL で、他システムから出力されてきたcsvファイルをテーブルへインポートしたいと考えています。 LOAD DATA INFILE で取り込もうとしていますが、対象のcsvファイルの特徴のためにうまく行かず苦戦しています。 取り込みたいファイルは、以下のようになっています。  ・各フィールドが "(ダブルクォート) で囲まれている  ・各フィールドは ,(カンマ) で区切られている  ・金額の項目には、桁区切りのカンマが入っている  例) "0001","あああああ",…(中略)…,"105,000","100,000","5,000",…     コード 項目名            税込み  税抜き 消費税  というような形です。    困っているのは、金額に使われている、桁区切りのカンマの処理についてです。  目的としては、データベースへ取り込むときには 105,000 は 105000 として取り込めればいいのですが、他システムから、桁区切りがなされた状態でcsvが作成されてきています。 LOAD DATA INFILE test.csv INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;  各項目のダブルクォートはENCLOSED BY で、項目を分けるカンマはTERMINATED BYで処理できていると思うのですが、金額の区切りに使われているカンマと項目の区切りのカンマを区別させられずに苦戦しています。  事前にcsvを加工するのも考えてはいるのですが、なるべくcsvを加工せずにそのまま取込したいと思います。  何か、簡単に回避できる方法等があればご教示願います。  宜しくお願いします。

    • ベストアンサー
    • PHP
  • CSVデータでmailアドレスにSMTPが邪魔

    アウトルックのデータをCSVカンマファイル形式で出力したところ、mailアドレスの最後に SMTPと表記されていました。 1.何でSMTPなんて付くのよ?!! 2.編集>置換 をしようとすると ”対象のデータが 見つかりません”となってしまいます。??なぜ 3.アドレスがハイパーリンク?(下線が付いてメーラ ーが立ち上がる)になっていますが、一括でハイパ ーリンクを解除する方法を。  以上3点 お教えていただけますか  よろしくお願いします。  

  • エクセルの文字列を空白で文字数を揃えたい

    皆様のお知恵を拝借したく書き込んでいます。 どうか宜しくお願いいたします。 エクセルにあるデータをカンマ区切りCSVに したいと思っております。 *例 1,1,1,3,1,2,11,・・・ これに数値を空白で埋めて四文字(0001,等)にさせたいのですが、 どのような方法が可能でしょうか? ・試したこと 1、サクラエディタでの正規表現 でも、置換後の文字列を動的に渡せるのかわからなくて失敗。 2、セルの表示形式 数値の桁数によって変化させる方法がわからず 3、エクセルマクロ LEN関数を使ってループさせれば可能? (時間がかかりそうです) 以上、宜しくお願いします。

専門家に質問してみよう