アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のような、カンマで区切られたCSVファイルがあるとします。

個人ID,測定日,速度,曜日,エラーチェック
a001,20110212,0,1,0
a001,20110212,5,1,0
a001,20110212,10,1,0
a002,20110212,2,1,1
a002,20110212,8,1,0
a003,20110212,10,1,1
a003,20110212,15,1,0

これが実際には下に4000万行ほど続き、ファイルサイズは2GBを超えます。
そのため、使用しているExcel(2010)では完全に開くことができません。

そして、やりたい作業は以下の2つです。

1、列を絞りたい
たとえば、個人IDと速度、エラーチェックだけ残してあとは消す、など。

2、行でファイルを分割したい
たとえば、a001さんのデータだけを抽出したCSVファイルを別で保存するなど。


最低限、巨大なCSVファイルを扱うことができるエディタがあればよいのですが、上に挙げた作業が簡単にこなせる機能があれば嬉しいです。

また、プログラムはFortran90を扱うことができますので、Fortranによる方法があればそちらでもかまいません。(その場合は、完全でなくてもよいのでソースを書いてくださると助かります。)

A 回答 (6件)

Linuxならgrepとawkでできます。


Windowsならこれを使えば。

http://www.vector.co.jp/soft/winnt/util/se365621 …
http://www.vector.co.jp/soft/win95/util/se376460 …

grepでa001を含む行だけ抽出

awkで特定の項目だけ抽出
    • good
    • 0

MS-EXCELではデータ吸うに限界があります。


MS-ACCESSを使えば簡単にできます。

エディタでやるなら、TeraPadはどうですかね?
データ数の限界は知りませんが、パソコンのメモリー限界までいけるんじゃないでしょうか?
2GBということなので、WindowsならXP機ではできないですね。
Windows7で、メモリーを4GB以上積んでいればできるのじゃないでしょうか?
    • good
    • 0

ACCESSのファイルサイズは


 2 GB からシステム オブジェクトに必要な領域のサイズを引いた値らしい。

Filemakerは
 単一のテーブル内のレコード数:ファイル寿命全体を通じて、合計 64,000 兆
                までのレコード
 ファイルサイズ : ハードディスクおよび OS の API の能力によって、最大8TB
ですから問題無いと思いますけど。
    • good
    • 0

書き忘れましたけど


Filemakerは30日体験版がありますので是非テストしてみて
結果をお教え下さい。ホントに4000万レコード扱えるのか。

体験版をインストールしたらデスクトップにショートカット
できるので、それにCSVをドロップするだけです。

1も2もメニューから選ぶだけですぐできますから是非お願い
します。
    • good
    • 0
この回答へのお礼

貴重なご意見、ありがとうございます。
Filemakerを試してみました。読み込みはできて、一応やりたかった作業はこなせそうです。
しかし、使用に関して問題点が多く、今回メインで使用することはあきらめました。
問題点は、以下の3つです。(使用PCは、Core-i7採用、16GB RAM、SSD搭載です)

1、読み込みに時間がかかる。(4000万行、2GBで1時間以上かかりました)
2、処理に時間がかかる。(列を1つ消すのに20分くらいかかりました)
3、余計なファイルが作成される。(編集用?に、1.5倍以上の容量のファイルが一緒に保存されました)

かなり便利なツールだとは思いますが、大容量ファイルには向かないのだと思います。

お礼日時:2011/10/16 09:27

早速テストしていただいてありがとうございます。


とても参考になりました。
やはり技術仕様をそのまま鵜呑みにはできないですね。
4000万行というのが凄いですけど。
    • good
    • 0

そりゃExcelのワークシートには読み込める行数の制限はありますが、


VBAでファイルの読み書きをする分には問題ないはず。(ただ、3GB位のテキスト
ファイルを読んだことがあるだけで、大容量のファイルの書き出しは
したことはないのだけれど。この時のExcelのバージョンは2000です。)
以下、VBAのサンプル。
Sub 列を絞る()
fno1 = FreeFile
Open "入力ファイル名" For Input As fno1
fno2 = FreeFile
Open "出力ファイル名" For Output As fno2

Do While Not EOF(fno1)
Input #fno1, a1, a2, a3, a4, a5
Write #fno2, a1, a3, a5
' a1 の前後に"(ダブルコーテーション)が挿入されます。
' 都合が悪ければ以下を使用のこと。
' Print #fno2, CStr(a1); ","; CStr(a3); ","; CStr(a5)
Loop

Close fno1
Close fno2
End Sub

Sub 行を分割()
fno1 = FreeFile
Open "入力ファイル名" For Input As fno1
fno2 = FreeFile
Open "出力ファイル名" For Output As fno2

Do While Not EOF(fno1)
Input #fno1, a1, a2, a3, a4, a5
If a1 = "a001" Then
Write #fno2, a1, a2, a3, a4, a5
End If
Loop

Close fno1
Close fno2
End Sub

フリーウェアを使用するのに制限がないのなら、No.1さんのgrep, awkを使用するのが
お勧めです。特にプログラムを書かなくても(書いても1行程度)実行可能なのが魅力です。
列を絞る場合:
  awk -F, '{ OFS=","; print $1, $3, $5; }' 入力ファイル名 > 出力ファイル名

行を分割する場合:
  grep "a001" 入力ファイル名 > 出力ファイル名

以上
    • good
    • 0
この回答へのお礼

大変丁寧に説明してくださって、ありがとうございます。
無事に目的を達成することができました。

お礼日時:2011/10/17 01:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!