![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
巨大な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/31】『寿司』がテーマの本のタイトル
【お題】 『寿司』がテーマの本のタイトルを考えてください
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
人生でいちばんスベッた瞬間
誰しも、笑いをとろうとして失敗した経験があると思います。
-
思い出すきっかけは 音楽?におい?景色?
記憶をふと思い出すきっかけは 音楽、におい、景色 どれですか?
-
CSVファイルの指定列だけを読み込んでEXCELに表示したい
Excel(エクセル)
-
【ExcelVBA】300万件越えCSVから条件を満たす行だけ抽出するには?
Visual Basic(VBA)
-
バッチで118項目のCSVを処理したいですが。。。
その他(開発・運用・管理)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
CSV形式での保存時に”文字列...
-
csvファイル 項目数取得
-
CSVファイルの項目行を削除...
-
マクロから出力されるcsvのダブ...
-
バッチでCSVを処理する時、空の...
-
csvファイルのデータの一部を取...
-
VBAでcsvファイルを読み込んで...
-
エクセルVBA 大容量CSVファイル...
-
Excel VBA ADOでのCSV取込みに...
-
巨大なCSVの加工(指定列のみの...
-
HTMLのリンク先ページの文字コ...
-
csvファイルを列数ごとに分割す...
-
COBOLでCSVをインプットにして...
-
csvファイルから列を選択しchar...
-
複数のcsvファイルをExcelに一...
-
ADODBでSQL実行前にレコードセ...
-
Excelで作成した単語帳をp-stu...
-
【C#】パス名で無効な文字
-
特定文字を入ってるCSVの特定の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
複数のcsvファイルをExcelに一...
-
マクロから出力されるcsvのダブ...
-
csvファイル 項目数取得
-
CSV形式での保存時に”文字列...
-
CSVファイルの項目行を削除...
-
【C#】パス名で無効な文字
-
csvファイルでの日付設定「yyyy...
-
【エクセルVBA】お願いします。...
-
エクセルVBA 大容量CSVファイル...
-
【ExcelVBA】UTF-8の文字コード...
-
データ解析ソフトRでのファイル...
-
【エクセル マクロ】読み込ん...
-
エクセル形式のファイルの読み込み
-
複数のCSVファイルのAccessテー...
-
VBAでcsvファイルを読み込んで...
-
巨大なCSVの加工(指定列のみの...
-
COBOL85でのCSVファ...
-
CSV出力して、MS/EXCELで開くと...
おすすめ情報