新生活を充実させるための「こだわり」を取材!!

お世話になります。

csvファイルの内容は各行
"ID_A","B","C","D","E","F","G","H","I","J",K","L","M","N","O","P","Q","R","S" で
項目行はなく、文字コードはUTF-8です。


IDは12バイトの数字で、うち1バイト目から8バイト目は日付、
9バイト目から2バイトは場所コード、
11バイト目から2バイトが品目コードです。

また、csvファイルのデータは、優先順位が ①日付、②場所コード、③品目コードで
昇順に格納されています。

この日付がエクセルシートABCのCells(1, 4)の値と一致する行のみを抽出し、
場所コードと品名コードをそれぞれ対応する日本語に置き換えたいです。

マクロでcsvファイル名を指定し、条件に合う行のみを編集処理をして
エクセルシートABCの2行目以降に書き出すにはどうしたら良いのでしょうか?

お手数をおかけしますがよろしくお願いします。


追記;
https://excel-vba.work/2021/01/04/%E3%80%90vba%E …
上記サイトを参考にマクロを作成したのですが、抽出できませんでした。

質問者からの補足コメント

  • csvファイルを更新するたびにデータ件数が増えることもあり、できるだけ高速で処理できるとありがたいです。

      補足日時:2021/05/03 19:49
教えて!goo グレード

A 回答 (7件)

カテゴリがrubyということで。



100万行のダミーデータ(約1.5GB)を作成してみて、それをシーケンシャルに文字列検索したところ、だいたい15~20秒ぐらいかかります。
----
>ruby -r benchmark -e "STDERR.puts Benchmark.measure{open('a.txt').readlines.collect{|s|[s.split(',')[0],s]}.find_all{|x|/210406/=~x[0]}.each{|x| print x[1]}}"
210406,0.12258189145312148,(ryaku)153440369
13.766000 1.625000 15.391000 ( 15.396476)
----

blue.moonさん(質問者)は、たぶんVBA(rubyじゃなくて。)でなんとかしたいということなんでしょうが、100万行を毎回読み込む処理の仕方をしてるかぎり、たぶん20秒くらいかかると思います。

なので、すでに回答があるとおり、Access使ったり、日付毎のファイルに分割したりとかしないと高速化は無理かと。

>上記サイトを参考にマクロを作成したのですが、抽出できませんでした。

見た感じサイトに書かれてることに間違いなさそうなので、がんばれば上手くいくのでは。
使えるなら、PowerQuery使ったほうが楽かも。
    • good
    • 2
この回答へのお礼

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

ご助言はまさにその通りだと思います。
ですが、(これは私の説明不足の部分でもあるのですが)
実際に毎回ファイル操作をする人が私ではなくコピペ程度しかできないので、
AccessやPowerQueryなどは使えず・・・

マクロのみで自己解決できました。 要した時間は11秒でした。
(検索対象ファイルサイズ:111,346KB)

お礼日時:2021/05/05 10:06

情報ありがとうございます。



あといくつか教えてください。
・CSVファイルはBOM付きですか?
・エクセルシートABCはシート名が「ABC」という事ですか?
・セル(1, 2)は「B1」セルという事ですか?
・セル(1, 4)は「D1」セルという事ですか?
・念のため、OS(Windows10 64bit等)とExcelバージョンはいくつですか?
・数値や文字列を別の数字や文字列に置き換えていただいてもいいのですが、
 それでも実際のCSVデータを写真で見せていただくことは厳しいですか?
    • good
    • 1
この回答へのお礼

おはようございます。
何度もありがとうございます。

私にわかりにくい説明のせいで
すっかりお手数をおかけしてしまい、申し訳ありません。

何とか自己解決できました。

お礼日時:2021/05/05 10:11

こんにちは。


エクセル2016、365ならパワークエリが標準で使えます。
パワークエリで読み込み、パワークエリ上で抽出作業を行なってシートに書き出すまたはデータモデルに追加してピボットテーブルで集計することができます。

ダミーでも良いので、サンプルデータを作ることができると助かります。

https://cpx.co.jp/blog/2908

以上ご参考となります。
    • good
    • 0
この回答へのお礼

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

何とか自己解決できました。

お礼日時:2021/05/05 10:50

念のため、実際の「csvファイル」の1行や、


エクセルシートABCや、エクセルシートABCのCells(1, 4)の状況を
写真で見せていただくことは可能でしょうか?

あと、条件に合う行はおおよそ何行くらいありますか?

余談になりますが、高速での処理を希望とのことですが、
例えばエクセルではなくてアクセスなどでは希望に合いませんか?
    • good
    • 0
この回答へのお礼

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

実際に検索するcsvはとある有料ソフトで作成した指数データ
("B","C",・・・・・・,"S"の部分で、小数点のある実数)ファイルなので、
生データをお見せできなくて申し訳ありません。

そのデータファイルを事象発生日毎のエクセルファイルに加工することが、
今回の作業目的です。

抽出条件=事象発生日=エクセルシートABCのセル(1, 4)の値で
数字8桁。
これが一致するデータは数件~600件程度です。

シートABCには、
セル(1, 2)の値が"日付データ名;"
セル(1, 4)の値は"20170501"のみが入力されており、
他のセルは全くの空白です。

また、編集済みエクセルファイルの実際の使用者が
コピペ程度しかできないため、アクセスでの処理は想定していません。

ABCシートのセル(1, 4)・・・、と言いましたが、
これはディスプレイに表示させたメッセージボックスに
yyyymmdd形式で指定、でも可です。

お手数をおかけしますが、よろしくお願いします。

お礼日時:2021/05/04 07:19

No.1です。



> …エクセルに全件インポートして・・・、ということでしょうか?
いいえ。
新しいEXCELを開いて、そのCSVを全件読み込み、
EXCELファイル間で必要な処理をすればよい、
と言う事です。

> でしたら処理時間がかかりすぎるのですが?
百万行もあれば、当然処理時間はかかります。
むしろ、そんな膨大なデーターを一つのCSVファイルにまとめてしまった、
これこそが、間違いと言えるでしょう。
    • good
    • 0
この回答へのお礼

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

自己解決できました。
> 新しいEXCELを開いて、そのCSVを全件読み込み
この部分はマクロのソースコードでは、Openメソッドで対応し、
全件検索しました。

> EXCELファイル間で必要な処理をすればよい、
条件にあう行のみ配列に加え、条件に応じて編集、出力。

ご回答の文面から、不愉快にさせたようで申し訳ありませんでした。

お礼日時:2021/05/05 10:47

こんばんは



>マクロでcsvファイル名を指定し、条件に合う行のみを編集処理をして~
>でしたら処理時間がかかりすぎるのですが?
マクロを使う選択という時点で、たいした速度は期待できないのでは?
    • good
    • 0
この回答へのお礼

ご指摘、ありがとうございます。

自己解決できましたが、やはりマクロのみだと11秒も・・・

お礼日時:2021/05/05 10:54

EXCEL2017以降では、1,048,576行迄あるので、


直接EXCELで読み見込めばよいと思います。
或いは、半分ずつでも。
    • good
    • 0
この回答へのお礼

早速のご回答、ありがとうございます。

csvファイルからABCシートのあるエクセルあるいは作業用エクセルに全件インポートして・・・、ということでしょうか?

でしたら処理時間がかかりすぎるのですが?

お礼日時:2021/05/03 19:52

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

教えて!goo グレード

人気Q&Aランキング