巨大なCSVの加工(指定列のみの抽出)について
下記のような構成のCSVファイルがあります。
"ID","a","b","c","d","e","f","g","h","i","j","k","l","m"
"0001","a","b","c","d","e","f","g","h","i","j","k","l","m"
"0003","a","b","c","d","e","f","g","h","i","j","k","l","m"
"0004","a","b","c","d","e","f","g","h","i","j","k","l","m"
・
・
・
例えば、
ここから"ID"列と"c"列と"f"列のみ抽出して新たなCSVファイルで保存。
という処理を行いたいのですが、行数が5000万行近くあり、ファイルサイズが80GB程あるので
エクセルはおろかアクセスでも開くことができません。
テキストエディタの秀丸64bit版なら開くことができますが、指定列の抽出方法が分かりません。
秀丸のマクロでもVBSでも良く、また膨大な待ち時間がかかっても構わないので実現する方法について
お知恵をお貸しください。
No.5ベストアンサー
- 回答日時:
"ID","a","b","c","d","e","f","g","h","i","j","k","l","m"
"0001","a","b","c","d","e","f","g","h","i","j","k","l","m"
扱いやすいように仕向けるのも手段の一つ。
"ID00","a","b","c","d","e","f","g","h","i","j","k","l","m"
"0001","a","b","c","d","e","f","g","h","i","j","k","l","m"
固定長になるものであれば
C列相当は16文字目から3バイト
F列相当は28文字目から3バイト
実際は固定長ではないのだろうが、
プログラムができるのなら、
そのプログラム技術で取り込みやすいデータに
加工することもできるのではないか。そういう工夫できることはないか。
最終目的でなくても何かできないか探してみる。
・・・のキーワードの後20バイトにC列とF列が
含まれているはず、となればその20バイトだけ抜き出すことで
扱うサイズがグッと減る。
工夫したければ、何か規則性を探す。
1行ずつ読み込んで判定を繰り返すプログラムで十分かと思います。
エクセルにろアクセスにしても
シートやテーブルに格納するだけが手段ではない。
VBAを使えばファイルI/O操作はできます。
No.4
- 回答日時:
VBAでもVBSでもかんたん。
No1の方の書いたとおりにやればできる。
ボクだったら、古典的(失礼)ファイルの開き方の代わりにFileSystemObjectを使うといっただけ。
丸投げは嫌いだから、デバッグしないで載せちゃうけど、こんな感じ
dim fso as new filesystemobject
dim ts1 as textstream
dim ts2 as textstream
dim a as variant
set ts1 =fso.opentextfile("hogehoge.csv",forreading,false)
set ts2 =fso.opentextfile("hogehogeout.csv",forappending,true)
do while not ts1.atendofstream
a = split(ts1.readline,""",""")
ts2.writeline a(0) & """,""" & a(3) & """,""" & a(6) & """
loop
ts1.close: set ts1 = nothing
ts2.close: set ts2 = nothing
set fso = nothing
メンセキジコウ 一応私の知識の範囲で間違いのないよう書いたつもりですが、、、
・vbaもしくはvb6で動くように書いたつもりです。
・デバッグしていないのでエラーが起きる可能性があります。
・ファイルの破損等、不測の事態に対しては責任を負えませんので、バックアップなりコピーとるなりして試してみてください。
・実際に動かすときは、カウンターを組み込んで進捗状況がわかるように知るべきだと思います。
・まずは一万件くらいからやってみて、どのくらい時間がかかるか想定してからやったほうが良いと思います。
・filesystemobjectを使うためには参照設定で、windows scripting runtimeにチェックを入れる必要があります。
余計なことだけど、
・実質6行のプログラムだよ。質問する間に書けちゃうけど、仕事じゃないよね。
・No1さんが手順をきっちり書いてるけど、少しは調べてみたのかな?
・作ったファイルだって読める代物じゃないと思うけど、どうすんの?→機械で処理するならそちらの処理側に書いたほうがいいじゃないかな?
この回答への補足
まだ理解できてませんが、徐々に調べて進めていきたいと思います。
私はプログラマではありませんので先の方が回答してくださった手順は考え方は理解できましたが、
だからといってどう実現すべきかは分かりませんでした。
しかし具体的なソースを見せていただけて助かります。
もちろん自己責任ということを承知の上ですのでご心配なく。
No.3
- 回答日時:
(大体件数的に読めないデータを何のために使うのかという問題はさておき)
データを見るからにはきっと何らかのDBから落としたもんなんだよね。
ってことは、DBを操作してほしいデータを抽出しなおすのが本筋。
DBへのアクセス権限がないのであれば、私だったら、fsoのreadlineをつかうかな。
何回もいろんな形で操作する必要があるなら、また、別のDBに突っ込んじゃうとか、
アクセスなどで、リンクテーブル作っちゃうとか言う方法もあるけど。
この回答への補足
件数は5000万件と申し上げております。
アクセスのリンクテーブルでも大きすぎて取り込めなかったはず?(もう一度試してみますが)
カンマ区切りで何番目と何番目と何番目をこのファイルに書き込む、という動作を
1行ずつ最終行まで延々と繰り返すような簡単なロジックで
VBS等で簡単に実現できないでしょうか。
ごく一般的な環境で実現可能な案があれば教えてください。
No.2
- 回答日時:
フィールド内に改行を含むような場合はPerlの「Text::CSV_XS」モジュール、Rubyの「CSV」モジュールを使った方が圧倒的に楽です。
http://www.ruby-lang.org/ja/man/html/CSV.html
No.1
- 回答日時:
何も悩むことはない。
一旦全レコードを読み込んで処理というエクセル的固定観念に毒されている。昔は1レコードを読んで処理が主流だったのだ。VBAでもVBSでもVB.NETでも旧Basicでもよい下記のためのステートメントがある。(1)ファイルをオープン(インプトファイルとアウトプットファイル各1つ)
(2)テキストを1レコード読み込む
(3)そのテキストを、カンマをデリミタとして、分離し配列に収納。Split関数利用
(4)第1列、C列、F列(配列インデックスでは0、2、5について新しいファイルに書き出す
(5)EOFまで繰り返し
(6)AT ENDでファイルをクローズ。
Googleででも「VBA テキストファイル オープン」「VBA テキストファイル 読む」「VBA Split関数」「VBA テキストファイル 書く」
などで照会し、勉強すること。
時間はかかるがやむをえない。。全レコーど対象のようだから1回は全レコード読まなければしょうがない。
そもそも3列のファイルをわざわざ作らなくても、別途何か本当の処理するときに他の列を使わなければ仕舞いのようにも思うが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Visual Basic(VBA) エクセルVBA 4 2022/05/14 00:51
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
CSVファイルの指定列だけを読み込んでEXCELに表示したい
Excel(エクセル)
-
【ExcelVBA】300万件越えCSVから条件を満たす行だけ抽出するには?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
複数のcsvファイルをExcelに一...
-
CSV形式での保存時に”文字列...
-
csvファイル 項目数取得
-
COBOLでCSVをインプットにして...
-
【ExcelVBA】UTF-8の文字コード...
-
EXCEL|csvで保存→開くcsvを閉じる
-
特定文字を入ってるCSVの特定の...
-
【C#】パス名で無効な文字
-
【エクセル マクロ】読み込ん...
-
マクロから出力されるcsvのダブ...
-
VBAでcsvファイルを読み込んで...
-
COBOL85でのCSVファ...
-
ACCESS CSVファイルをインポ...
-
Excel VBA ADOでのCSV取込みに...
-
CSVファイル作成
-
VBAでCSVファイルのデータを集...
-
VBA 毎日取得するデータを反映...
-
csvファイルでの日付設定「yyyy...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
csvファイル 項目数取得
-
マクロから出力されるcsvのダブ...
-
CSV形式での保存時に”文字列...
-
【C#】パス名で無効な文字
-
エクセルVBA 大容量CSVファイル...
-
データ解析ソフトRでのファイル...
-
CSVファイル作成
-
VBAでcsvファイルを読み込んで...
-
複数のcsvファイルをExcelに一...
-
CSVファイルの項目行を削除...
-
csvファイルでの日付設定「yyyy...
-
複数のCSVファイルのAccessテー...
-
csvファイルを列数ごとに分割す...
-
エクセル形式のファイルの読み込み
-
【エクセル マクロ】読み込ん...
-
VBAでCSVファイルのインポート...
-
【ExcelVBA】UTF-8の文字コード...
-
csvファイルのデータの間引きを...
おすすめ情報