• ベストアンサー

CSVファイルの中身を操作したいけど何の言語がいいのでしょうか

驚くべきCSVファイルがあります。100MBとか。たぶん、行が何十万行となるんでしょう。エクセルでは開ききれず6万5千行くらいまで開かれて残りは見れませんでした。 このCSVファイルを操作したいのです。CSVファイルはコンマ区切りのファイルですが、例えば 1,1,3 2,2,1 1,1,2 1,2,1 こんな内容だったとして、二番目の数字が2の場合の行のみをコピーして別の新しいCSVファイルが作りたいのです。 こういう操作はどんな言語で可能なのでしょうか。簡単に書けるのでしょうか。 私が持っているもので使える環境があるのは、C言語、MicrosoftのVisual BasicとVisual C++? です。Javaもあったような。 あと、気になってるのはMatlabです。

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

  • ベストアンサー
  • Fushino
  • ベストアンサー率59% (329/550)
回答No.8

#7です。 AWK は各プラットフォームへの移植が行われており Windows版も入手可能です。 最新版(たぶん)は以下のサイトより、旧版(安定版)は Vectorでも、入手できます。 スクリプティング言語資料室(仮) http://www.kt.rim.or.jp/%7Ekbk/index.html Vector:ダウンロード Windows > ユーティリティ > テキストファイル用 > AWK http://www.vector.co.jp/vpack/filearea/win/util/text/awk/ マニュアルを見直していたら今回の処理なら gawk -F, "$2==2" 入力ファイル > 出力ファイル だけでもいいようです。

rabitwo
質問者

お礼

ありがとうございます!! 今度やってみます。コマンドというかプログラムもありがとうございます!!

その他の回答 (7)

  • Fushino
  • ベストアンサー率59% (329/550)
回答No.7

テキストファイルの加工であれば AWK がお薦めです。 基本的にファイルの入出力は標準入力・出力で行ないますので、ファイル入出力の処理を記述する必要が無く、データの処理内容だけで済みます。 機能的にはそんなに高度な関数等はありませんが、一般的なテキストファイルの加工には十分だと思います。 ちなみに、例題のような処理であれば特にスクリプトを用意しなくても以下のようなコマンドラインで実現可能です。 gawk -F, "($2==2){print}" 入力ファイル > 出力ファイル AWK - Wikipedia http://ja.wikipedia.org/wiki/AWK

rabitwo
質問者

お礼

回答ありがとうございます。 AWK(オーク)ってすごく便利そうですね!! 必要な処理が一文で十分なんて、すごいです!! UNIX上で開発されたフィールド指向のテキスト処理スクリプト言語とのことですが、Linuxを入れたPCで利用できるのですか? Windowsではやっぱりできないのかな・・・。期待しているのですが。

  • equinox2
  • ベストアンサー率48% (321/660)
回答No.6

この程度ならVbscriptでもよろしいかと・・ ----------- 以下は参考 -------- '実行方法 コマンドプロンプトから  cscript aaa.vbs in_file out_file ' Dim FSO, Stream(1) Dim str, aryStr ' if WScript.Arguments.Count > 1 then if WScript.Arguments(0) <> WScript.Arguments(1) then Set FSO = CreateObject("Scripting.FileSystemObject") Set Stream(0) = FSO.OpenTextFile(WScript.Arguments(0), 1) Set Stream(1) = FSO.OpenTextFile(WScript.Arguments(1), 2, True) Do Until Stream(0).AtEndOfStream str = Stream(0).ReadLine aryStr = Split(str,",") if UBound(aryStr) >= 1 then if aryStr(1) = "2" then Stream(1).WriteLine str end if end if Loop Stream(0).Close Stream(1).Close Set FSO = Nothing else WScript.Echo "aaa.vbs in_file out_file" end if else WScript.Echo "aaa.vbs in_file out_file" end if

rabitwo
質問者

お礼

ありがとうございます。 「Vbscript」これも知らなかったのですが、Visual Basicみたいな言語でWindowsには標準で入ってて使えるもの、という感じでしょうか。ウィキペディアで見てみました。 参考のプログラムありがとうございます。

noname#223623
noname#223623
回答No.5

CSVファイルの処理は意外に面倒です。どの言語でやるにしろ、既存の関数やライブラリなどで処理したほうが自力でゴリゴリやるより楽だと思います。ここではExcelのVBAでやる方法を紹介します。 #1さんの回答に関連しますが、split関数を使う場合、 > 前提としてデータの中に ,(カンマ) が無い時ですが。 とあるように、次のようなデータではうまくいきません。  "abc,def",1,"ghi" このデータは次のように分割されます。  配列(0): "abc  配列(1): def"  配列(2): 1  配列(3): "ghi" 解決策として、ADOを使ってCSVファイルをデータベースとして扱う方法があります。これなら値の中にカンマが含まれていても問題ありません。具体的な方法は参考URLを読んでください。 処理の段階として、「(1)SQL文の実行」と「(2)実行結果を○○する(具体的な処理がわからないので○○です)」に分かれますが、少なくとも(1)の段階でExcelの行数制限に縛られることはありません。(2)でExcelのワークシートにコピーする場合は行数制限が絡んできます。 問題になるのは100MBという容量ですね。処理時間がどれくらいになるかは環境によるので、実際にやってみるしかないです。ちなみに自分でも試してみました。適当なデータですが500万件(114MB)から5万件を抽出、結果をCopyFromRecordsetでワークシートにコピーすると2分位かかりました。PCはCPU P3-600MHz, RAM 192MBなので今のPCだとずっと早いはずです。CopyFromRecordsetは単純にコピーするだけなので、レコードごとの処理が追加されればさらに時間がかかります。 WSHで処理することもできます。コマンドプロンプトで実行、結果はCSVファイルにリダイレクトしましたが処理時間はあまり変わりません。抽出だけならこれでも十分だと思います。あとは適当なアプリケーションで処理するということで。

参考URL:
http://home.att.ne.jp/zeta/gen/excel/c04p47.htm
rabitwo
質問者

お礼

ありがとうございます。 ActiveXデータオブジェクト(ADO)は初めて聞きました。 SQL文はリレーショナルデータベースを操作する時の言語なのですね。やっぱりExcelのワークシートにコピーする段階で行数制限がひっかかるでしょう(汗) WSHとはWindows Script Host?? 聞いたことありません。回答者さま、詳しいですね。おそれいります。

回答No.4

ならVBにしておいたほうがよいのではないかと

rabitwo
質問者

お礼

ありがとうございます。VBがいい気がしてきました(^^;

回答No.3

Perlですね。簡単に書けるし。 処理の仕方にもよりますけど速度も十分です まあ、100Mくらいだったらどの言語使っても問題ないと思います。 処理も難しいことをやるわけじゃないんで、使いやすいものを。

rabitwo
質問者

お礼

ありがとうございます。 Perlですか。名前しか知らないんですけど、簡単なんですか(^^; 100Mくらいだとどの言語を使うかはあまり問題にならないのですね。そうだと初歩しかできないけどC言語とVisual Basicは使ったことがあるので、その言語でどうやって書くかを考えはじめたほうがいいかなと思いました。

  • mindatg
  • ベストアンサー率48% (110/227)
回答No.2

CSVの仕様無視ならVBかVBS(VBAで抽出分割してそのままエクセルに読み込む)が楽じゃないでしょうか。 仕様準拠やら高速性を求めるならCできっちり書いた方が宜しい感じ。 たかだか数百MBなら前者で十分な気もします。 あとは適当な行数でテキストファイルを分割できるフリーソフトとか http://www.vector.co.jp/soft/win95/util/se088352.html MatLabはその抽出したデータをそのまま使いまわすなら便利かもしれませんが、あんな起動だけでもイライラするソフトで抽出・分割だけするならおススメできないです。

rabitwo
質問者

お礼

ありがとうございます。 エクセルで開くと「データを全部読み込めませんでした」ってなって、6万5千行くらい全部埋まるんですけど、何回かに分割して読み込むこともできるんですね。 適当な行数でテキストファイルを分割できるフリーソフト、紹介ありがとうございます。リンク見ました!! やろうと思えばそれで分割してエクセルで開いて、VBAで必要なデータの切り出しができますね(エクセルのVBAを使った切り出しは既にできます)。問題は手間です。そんなCSVファイルが何百個あるので。 MatLabはまだ使ったことがないのですが、抽出したデータで度数分布表を作って最頻値を見たり、尖度、歪度などを調べたいと思ってます。基本統計量です。そこまでやることを考えたらMatLabの方がいいかもしれないですか?

  • uchan777
  • ベストアンサー率0% (0/2)
回答No.1

私であればVisual Basicを利用します。 前提としてデータの中に ,(カンマ) が無い時ですが。 以下は、Visual Basicの経験があるものとして書かしてもらいます。 Split関数というものがあり文字列を決まったコードでセパレートし配列にしてくれます。 文字列 1,1,3を ,でセパレートした場合、 1 1 3 といった形の配列になり容易にターゲットとなるデータにアクセスできます。 ですので (1)元ファイルオープン (2)出力ファイルオープン (3)元ファイルから1行読み出し。 (4)読み出し行をSplitして2番目の要素チェック (5)対象外なら(3)、対象なら出力ファイルに書き出し。 (6)(3)~(5)をファイル終端まで繰り返し。 (7)出力ファイルクローズ (8)元ファイルクローズ のような流れでどうでしょうか?

参考URL:
http://www.red.oit-net.jp/tatsuya/vb/string.htm#Split
rabitwo
質問者

お礼

ありがとうございます。 Split関数でカンマでセパレートすればあとは何番目の配列かを指定してデータを操作できるということなんですね。 アルゴリズムというかフローチャートというか、それも納得です。 Visual Basicでもいけるんですね。

関連するQ&A