• 締切済み

pealを用いたcsvファイルの抽出

現在1.5GB程のcsvファイルを処理しています 通常通りExcelやその他csvを開くソフトで開こうとしても どうしても処理に膨大の時間がかかる一方で一部しか開けない現状です そこでpealを用いて抽出をしようとしているのですが うまく出来ないのが現状です 仮に花のデータがあったとします 花の種類としてはチューリップやあじさい10種類以上の花があり 色や花識別番号,花の数が別の列に数字として入力されています   1行目が(空白),種類,色,花識別番号,花の数,実の数,枯れた花の数   2行目が(空白),チューリップ,黄色,1,2,2,2 3行目が(空白),チューリップ,緑,2,4,2,2 ...   10行目が 3行目が(空白),あじさい,緑,2,4,2,2 … ...以下同様にあじさいなど他の花の種類も入力されているとします このとき,花の名前と色と花識別番号を指定して 花の名前と色と花識別番号,花の数,実の数,枯れた花の数のデータを抽出をしたいのですが どうしても1列目の花の種類しか指定ができず,2列目以降の色や花識別番号を指定することができません 仮にチューリップを抽出しようとする場合は while(<STDIN>){ my @line = split(/,/, $_); $cols = @line; if($cols>1) { if($line[1] eq "種類" || $line[1] eq "チューリップ"|| $line[2] eq"2" ||) { print $_; } } } 現状は…以上ののような形にて作成してます しかし,これではうまくできませんでした 分かる方いらっしゃいましたら知恵を貸してください

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

みんなの回答

  • ybnormal
  • ベストアンサー率50% (220/437)
回答No.4

こういうデータを持ったファイルがあるとして、それをflower.csvと名付けます。 name, color, id, num_of_flower, num_of_fruit, dead tulip, yellow, 1, 2, 2, 2 tulip, green, 2, 4, 2, 2 rose, green, 2, 4, 2, 2 で以下のコードでこのファイルを読みこんで連想配列上にデータベースを作ってから、花の名前と色と識別番号をコロンでつなげて一つのキーとして連想配列に入力すれば所望の情報を得られます。 #!/usr/bin/perl open(F, "flower.csv"); while(<F>){ chomp; s/\s+//g; @x = split(/,/, $_); $key=$x[0].":".$x[1].":".$x[2]; $info{$key} = "$x[3] $x[4] $x[5]"; } close(F); print "=> "; while(<>){ chomp; print "$info{$_}\n"; print "=> "; } 実行例 > ./foo => tulip:yellow:1 2 2 2 => tulip:green:2 4 2 2 => rose:green:2 4 2 2 =>

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

>通常通りExcelやその他csvを開くソフトで開こうとしても  CSVは、Comma-Separated Valuesの略でテキストファイルですから、Excelやその他CSVを開くソフトと言うのは間違いでしょう。テキストエディタで扱いましょう。  例えば正規表現が扱えるEmエディタ( https://jp.emeditor.com/ )のようなテキストエディタでしたら、置換操作で ^((?!^,チューリップ,1234).)+\n ↓     ここは何も書かない。 で一致しない行は消し去ることができます。  もっと早くしたければ、なんと言ったってSED( http://ja.wikipedia.org/wiki/Sed_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29 )です。1.5GB程度なら十数秒で終わる。SEDの資料はネット上にたくさんあるのでそれを参照  Perl(pealじゃない)を使う場合は、大量に読み込むと危険なので open(IN,"data.csv"); while(<IN>) { 正規表現処理で一致しない物をリスト@abcに格納 } close(IN); open(OU,"+> data2.txt"); while(<@abc>){ print OU $_; } close(OU);

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

具体的に、どんな風に「うまくいかない」なのでしょうか? 「条件に一致しているはずなのに出てこない」 と 「条件に一致しないのに出てくる」 と 「エラーで動かない」 とでは、対処方法も違います。 ( $line[1] eq "種類" || $line[1] eq "チューリップ"|| $line[2] eq"2" ||) これが、どんな抽出をしようとして書いたのか、それが書いてないので、修正方法もわかりません。 このままだと、  1列目が「種類」   または  1列目が「チューリップ」   または  2列目が「2」   または ...で || の後に式が無いからエラー 最後の || が間違いだとすると、 $line[2] は 「色」なので、 「2」になることは無いと予想されます。 ですが、line[1] eq "チューリップ" が成立すれば、全体としてifの条件が成立します。 $line[3]の間違いだとすると > 10行目が (空白),あじさい,緑,2,4,2,2 も$line[3] == 2 ですから、該当します。 確実にハマりそうなのは while(<STDIN>){ my @line = split(/,/, $_); <>で読み込んだ文字列には、改行文字まで含まれています。 そのままspitすると、最後の項目は $line[7] = "2\n" 等としたのと同じになり、文字列で比較すると "2" ne "2\n" となります。 また、このsplitでは、前後の空白が残ります。CSVの書き方次第では $line[3」ne "2" # line[3]=" 2 "になっている 等となる可能性もあります。

hyappydesugn
質問者

補足

このとき,花の名前と色と花識別番号を指定して 花の名前と色と花識別番号,花の数,実の数,枯れた花の数のデータを抽出をしたいのですが どうしても1列目の花の種類しか指定ができず,2列目以降の色や花識別番号を指定することができません 仮にチューリップと花識別番号2番を抽出しようとする場合は while(<STDIN>){ my @line = split(/,/, $_); $cols = @line; if($cols>1) { if($line[1] eq "種類" || $line[1] eq "チューリップ"|| $line[2] eq"2" ||) { print $_; } } } としました。結果としてチュウリップに該当するものはすべて抽出され 花識別番号は2番以外ののものも抽出されています 当該ファイルは動いているのですが,思ったように挙動していないのが現状です

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> 抽出をしようとしているのですが 別ファイルとしてもよければ、コマンドプロンプトで FINDコマンドで絞り込みして、リダイレクト。 参考URLの中央あたり、「フィルタとしても利用可能」で FINDにTXTファイル読ませ、表示してます。 画面出力を>で別ファイルにすることでサイズを小さくできます。 何度か条件を変えながら繰り返せば、EXCELでも読めるサイズになるかと。

参考URL:
http://www.atmarkit.co.jp/ait/articles/0103/01/news001.html
hyappydesugn
質問者

補足

このとき,花の名前と色と花識別番号を指定して 花の名前と色と花識別番号,花の数,実の数,枯れた花の数のデータを抽出をしたいのですが どうしても1列目の花の種類しか指定ができず,2列目以降の色や花識別番号を指定することができません 仮にチューリップと花識別番号2番を抽出しようとする場合は while(<STDIN>){ my @line = split(/,/, $_); $cols = @line; if($cols>1) { if($line[1] eq "種類" || $line[1] eq "チューリップ"|| $line[2] eq"2" ||) { print $_; } } } としました。結果としてチュウリップに該当するものはすべて抽出され 花識別番号は2番以外ののものも抽出されています 当該ファイルは動いているのですが,思ったように挙動していないのが現状です

関連するQ&A

  • オートフィルターの抽出されない条件とは

    シートに8列の項目があり項目に対応する文字列を入力しているブックがあります。A列に識別コード(主キーみたいな感覚で)作成してこれまでは Sheet1.Range("A1").AutoFilter Field:=1, Criteria1:= _ "=*08??", Operator:=xlAnd として抽出したい文字列だけ抽出できていました。 今回、別の識別コード(具体的には月日です)をA列に新たに挿入して同じように抽出を試みましたが、何も抽出されず文字列が入力されている最終行の次の1行以前が消えてしまいます(空欄が抽出された)。しかし、完全一致であれば抽出できます。なぜでしょうか?  ちなみに新しい識別は月日なので4桁の数字で10月10日→1010というようにしています。これで10月の行を抽出したいので"=10??"で抽出をかけてみたりしているのですが・・・。

  • 複数シートからの行 抽出改良バージョン

    https://okwave.jp/qa/q9586463.html ↑この質問の回答を頂いた者ですが、改良したいと思っています。 もしよろしければ、ご回答お願いいたします。(前回は操作ミスでベストアンサーにできず、申し訳ありませんでした。) この質問では、「各シートの表が上から順番に埋まっていること」を前提に「1列目と2列目が空白でない行を全て抽出する」ことになっています。つまり空白行が出た時点で次のシートへ抽出対象が移ります。 改良バージョンが「各シートの1列目と2列目とX列目(A1セルの値を代入)が空白でない行を全て抽出」です。問題がX列目は空白の行と空白になっていない行が混在していることで、X列目が空白でもそのシートの2列目にデータが入っている最後の行(2列目は途中に空白はない)まで調べて抽出する必要があります。 新しく添付した画像の例では、Xが10列目のときは、橋本、浜崎、根本、末吉、恩田の行が抽出されるようにしたいです。 コードを改良していただけませんか?

  • 特定の記号の数による、任意の文字行からの抽出。

    文字行がありB2からB15まで、A列の記号で表しています。文字行は任意です。 B列の文字行を特定の記号の数で抽出するとB2からB8までをC列からG列までのように表せます。 A列  B列     C列    D列  E列   F列   G列 1記号・ 文字行 抽出記号    2〇・・△△〇・・・〇・・・・・〇・・・・・〇・・・・・△△・・・〇                3△・・△△〇・・・〇・・・・・〇・・・・・〇・・・・・〇・・・・・△△                  4凵・・凵〇〇・・・凵・・・・・凵・・・・・凵・・・・・〇〇・・・〇〇                   5И・・凵И△・・・凵・・・・・凵・・・・・И・・・・・凵・・・・・凵                6・・・・И△△・・・И・・・・・△△・・・△△・・・И・・・・・И 7・・・・△△△・・・△△△・△△△・△△△・△△△・△△△      8・・・・凵И△・・・△・・・・・И・・・・・凵・・・・・凵・・・・・凵 /・・・・ 15・・・ 特定の記号の数:4種 B2:B8で、列に 1)〇が総数2コ 2)凵が2コ 3)Иが1コ で、 空白なしとします。 こんな文字行があり、特定の記号の数を1)2)3)とすると、C列からG列のようになります。 文字列に空白がない、こんな抽出をしたいのですが、 このような抽出はどうすればよいでしょうか、どなたか教えていただけませんか。 よろしくおねがいします。

  • Excel2010 フィルタで抽出できない

    Excel2010(WindowsXP)のフィルタ機能で抽出できない場合があるようなのですが そういうものでしょうか? 以下のような10000行以上の重複しない14桁のデータで 10000行目の前後に空白セルがある場合 フィルタでB列の「10000000010003」以降のデータが抽出できません。 左からA列、B列 a b 1 (空白セル) 2 10000000000002 3 10000000000003 4 10000000000004 5 10000000000005 (この間も連続データ) 9997 10000000009997 9998 10000000009998 9999 10000000009999 10000 10000000010000 10001 10000000010001 10002 10000000010002 10003 10000000010003 10004 10000000010004 10005 10000000010005 10006 10000000010006 10007 (空白セル) 10008 10000000010008 10009 10000000010009 10010 10000000010010 ---

  • エクセルのデータ抽出

    会社で注文のあった業者のリストをエクセルで 作ってて450行くらいあります。 各項目には会社名や内容や価格などありますが その中には空白のセルや行もあります。 そこからA列に自分が抽出したい行に印をいれて フィルタをかけたところ、空白があるためか すべてを抽出できません。1行1行抜き出すのもいいのですが 今後、データも増えることを考えると 何かいい方法で抽出したいのですが、 どうしたらいいでしょうか? やはりマクロをつかうのでしょうか? すみませんがよろしくお願いいたします。

    • ベストアンサー
    • Mac
  • 同じ様式の表の複数シートから行ごと抽出

    A2:K12の範囲に表がある全く同じ様式のシートが複数あります。 特定の条件が満たされた行を全て別シートに抽出したいです。 1列目と2列目とX列目(これは集計のA1セルに入った値を参照)が空白でない行を全て抽出したいです。1列目と2列目は1行目から順番に埋まっているのですが、X列目は空白になっているものと空白でないものが混在しています。 たとえば、Xが10列目のときは、Aさん、Bさん、Cさん、Dさん、Eさんの行が抽出されるようにしたいです。 VBAのコードを自力で書けないので、よろしくお願いします。

  • テキストファイルからの抽出

    VBAでもコマンドプロンプトでもいいのですが、1000行くらいあるテキストファイルを読み込んで、キーワード「タイムアウト」を含む行の1つ手前の行の文字列を抽出、それらを1つのファイルにまとめて出力させたいのです。 VBAで自分なりにやってみたのが http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12142881517 の最後の回答にあるマクロに手を少し加えて「タイムアウト」のある行番号をテキストファイルに出力し、その出力ファイルを読み込んで、一つ手前の行番号のリストを作ることまではできました。 ですが、どうやってそのリストから行番号を指定して、元のファイルからタイムアウトを含む行の1つ手前の行を抽出し、1つのファイルにまとめて出力させられるのかが分かりません。 後Powershellはまだ勉強途中なのですが、こっちでならできますか? アドバイスをお願いします。

  • EXCELで100行に1行ずつ抽出したい

    現在卒業研究中でエクセルを使っています。 そこで分からない事があるんですが、約10万行のデータがある列から100行に1行ずつ抽出し、横に1000行の列を作りたいと思ってます。 抽出する行は[1,101,201...]や、[100,200,300]等、番号は問いません。ただランダムではなく、100行ずつ順番に並べたいです。 どなたか詳しい方いらっしゃいましたら、教えていただけないでしょうか? よろしくお願いいたします。

  • 複数CSVファイルをExcel形式1つにまとめたい

    VBA初心者です。 似たような質問・回答がありますが、どうも私の意図するところと異なるので、 新たに質問させていただきます。 どうぞお願いします。 仕事場で、基本1日1ファイル取得している複数のCSVファイルを、 1週間に一度Excelファイルに一週間分のデータを追加し、 最終的には1か月毎に1つのExceファイル(1シート)に集計してます。 全ファイルとも内容は同じで、1シートで作成されており、 タイトル行は1行目、2行目以降データ(行:データ数はファイル毎に異なる)、 列数はA-IV列といった構成になります。 新しい1つのファイルにまとめる際には、 B列とG列のみ抽出し、一行目にタイトル行、2行目からデータ、 最終行に次のファイルのデータと、いうように複数のファイルのデータをつなげて 1つのファイルにしたいのです。 ちなみに出来上がったExcelファイルとしては、 A列に元CSVファイルのB列データ、C列に元CSVファイルのG列データ、 B列に各データがどのCSVファイルの物か分かるように、 各ファイル名の日付にあたる後ろ部分を表示させたいのです。 ファイル名から日付を拾えない場合は、 ファイルをまとめる前に、列を挿入し、 C列にデータ日付の項目を作り、そこに日付を入力し、 まとめる際に、B・C列+G列を抽出、といった形で、まとめられたらと思ってます。 *各Exceファイルのタイトルの後部分がデータの日付を表す (タイトル例:0803abcde2013_08_03.xls) B列2行目以降に、それぞれ抽出したデータのファイル名から、 日付にあたる部分を書き出し(8月3日と言ったように)表示させたい。 場合によっては、前部分を抽出するパターンもあるので、そちらもお願いします。 *今後、他の何種類かの複数CSVファイルでもファイル毎に (こちらも全ファイルとも内容は同じ)同様に1カ月毎にまとめたいので、 違う条件でも抽出できるように、応用できたらと、考えております。 (抽出する列がB列とI列のみ、A~C列+F列など) VBAで作業したいと考えてます。色々とお手数ですが、よろしくお願いします。 また、他にお勧めのサイトや、参考になる質問がありましたら、 合わせて、教えていただけると幸いです。

  • EXCELでの抽出

    EXCELで、式が入ってる列があります。 同じ数式ではなく、その列によって種類が異なる 数式がはいっております。 ある事情から、その列で、Aという数式が設定されている行だけ抽出したいのですが、なにかいい方法がありますでしょうか? いろいろ試してみましたがうまくいきません。 よきアドバイスお願いいたします。

専門家に質問してみよう