[[20250901080111]] 『データ件数が100万〜1000万件あるCSVファイルの編』(まっつわん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『データ件数が100万〜1000万件あるCSVファイルの編集について』(まっつわん)

 データ件数が100万〜1000万件あるCSVファイルの編集をすることになりましたが、そのままではエクセルのシート上に展開できないので、どのような方法を使えばよいかアドバイスをください。

< 使用 Excel:Excel2021、使用 OS:Windows11 >


編集って何をするんですか?

ワークシートの行数と列数 1,048,576 行、16,384 列

というのがエクセルの制限なので、ざっと100万行ですね。
この制限を超えるサイズのデータをエクセルで扱うのには無理があるように思いますが。

どの程度の編集ができるのかは知りませんがEmEditorというのもあるようですが。
https://forest.watch.impress.co.jp/docs/topic/special/1590268.html

また、UNIX系のストリームエディター?とかそういうのも考えてみたらどうでしょうか?
特定の条件にあう行を抜き出したいならgrepとか?
あるいはawkとか?あるいはsedとか?

Windowsdでも使えるものをGNUが出してるんじゃないかな?(知らんけど)
(ゆたか) 2025/09/01(月) 08:50:09


 私の場合、普段からExcelとSQLite3を連携させているので、
 一旦、CSVを読み込みながら、SQLite3へインポートして、
 編集はSQLで行う、ですかね。

 SQLite3単独でも、csvのインポートができるので、Excelがいらないかも。

 編集がカラムに対し一括編集とか、特定の値に対し編集とかなら、SQLが楽ですね。
(tkit) 2025/09/01(月) 08:56:56

回答者の(まっつわん)さんですか。
(?????) 2025/09/01(月) 22:11:12

編集ってどんな感じなのかわかりませんが
私ならワードを使ってみるかな
時間のかかり具合であきらめる
(地味に編集) 2025/09/01(月) 23:35:13

回答ありがとうございます。

データの中身は、
X    Y    Z    R  G  B
100.123 90.335 90.123 56  20 30
120.334 90.532 89.885 20  55 38
 ・
 ・
 ・
というのが現状、約140万件あり

別に修正するデータのリストが約2000件
X    Y    Z    R  G  B
100.123 90.335 90.200 56  20 30
120.334 90.532 90.200 20  55 38

XとYの値が同じものを探してZの値を書き換えたいです。

年に数回しかこういう作業は行わないので、
使い捨てマクロで対応できればと思ってます。

ワードをあんまり使ったことないですが、ワードもありですね。
テキストエディターはちょっとこういう作業ができるかどうかがわからないですけど、
胴なんでしょう?
SQLite3は使い方を覚えるのに敷居が高く感じます

 >回答者の(まっつわん)さんですか。
そうです。最近は3DCAD的なソフトで遊んでいるので、
こちらはご無沙汰かと思います。

大量のデータを扱ったことがなく、
とっかかりのヒントがいただきたく質問してみました。
(まっつわん) 2025/09/02(火) 11:25:02


 >使い捨てマクロで対応できればと思ってます。
 とはいえ、速度的にはpython 使った方がいいと思います
 pandasというライブラリを使えば大きなファイルを分割して読みで処理できるはず

 最近はAIがさらっとコードを作成してくれますし
(´・ω・`) 2025/09/02(火) 12:15:26

 AIじゃないけど、こんな愚直なものではどうでしょう。

 Sub test()
     Const fname As String = "D:\MyDocuments\202509\testdata.csv"
     Dim dic As Object
     Dim textLine$
     Dim ary
     Dim k&, s$

     Set dic = CreateObject("Scripting.Dictionary")

     Open fname For Input As #1
     Do While Not EOF(1)
         Line Input #1, textLine
         ary = Split(textLine, ",")
         dic(ary(0) & "," & ary(1)) = ary(2)
     Loop
     Close #1

     For k = 1 To 10
         s = Cells(k, "A") & "," & Cells(k, "B")
         Cells(k, "D") = dic(s)
     Next
 End Sub

(xyz) 2025/09/02(火) 12:32:37


 200万件データでやりました。少し時間はかかるけど年に1,2回ならいいんじゃないかと。

(xyz) 2025/09/02(火) 12:34:40


 ざっくり1行40バイトとして、1000万行で400Mbyte 
 と考えたら、そんなに大きくないですね

 4Gbyte越えるとVBAでは読み込めないかもしれませんが、400MByteならいけるでしょう
(´・ω・`) 2025/09/02(火) 12:53:02

 VBAだと200秒かかりましたが、pythonだと0.8秒、julia は0.4秒でした。

(xyz) 2025/09/02(火) 13:54:51


 ファイルの関係が逆でした。
 2000件のデータを辞書に持ち、
 140万件のデータを
 1件読んで、
 ・辞書にあれば、修正したもので、別CSVに書き出し
  ・辞書になければ、そのまま      別CSVに書き出し
 これを繰り返します。
 コードは省略します。質問者さんに失礼にあたるかも。 

(xyz) 2025/09/02(火) 16:42:44


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.