質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

3回答

7018閲覧

CSVファイルを高速に読み込む方法

mori_C

総合スコア34

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

0クリップ

投稿2020/07/10 05:56

VBで簡単なプログラムを作成しております。
内容はcsvファイルにあるデータを読み込み、簡単な計算や置き換えを行い、
別ファイルに保存するというものです。
500行ぐらいの場合は気にならなかったのですが、扱うデータが1000行を超えたあたりから、処理速度が気になるようになり、現在取り組んでいるデータの10000行ぐらいになると、無視できないぐらいになりました。

現在のプログラムは
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis") '文字コードの指定
filepath = "C:\Users\data.csv"
'ファイル中身を文字として読み込み
readstring = System.IO.File.ReadAllText(textFile, enc) '読み出したファイルを文字列として読み出す

'For i = 1 To 10000 '仮に10000行分

gyou(i) = Split(readstring, vbCrLf)(i) '一旦行を抜き出す インデックスは飛ばす 改行コードはvbCrLf data1(i) = Split(gyou(i), ",")(0) data2(i) = Split(gyou(i), ",")(1) 'PC読み出しデータ data3(i) = Split(gyou(i), ",")(2) data4(i) = Split(gyou(i), ",")(3) ' data5(i) = Split(gyou(i), ",")(4) '時間 Next i

現在の処理時間は5秒から10秒程度です。

何か参考になる書き方ありませんでしょうか。
詳しいかた、ご教授をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

提示されているソースのみを高速化するとすれば
File.ReadLinesメソッドを使う
ループ内のSplit(gyou(i), ",")は1回だけ行う
といったところでしょうか

もしくはTextFieldParserクラスを使用するとか

投稿2020/07/10 06:02

編集2020/07/10 06:11
YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mori_C

2020/07/10 06:11

各行を読み出し、区切り文字で別の配列に入れるところが おそいので、何かべつの方法があればよいのですが。 split("文字列",",")(何列目) という書き方以外 よくわかっていません。
YAmaGNZ

2020/07/10 06:14

split("文字列",",")はstringの配列を返すものとなります。 これを各要素を取り出すときに毎回行うのではなく、変数に代入して使いましょうということです。 Dim Values As String() = Split(~) といった感じで
mori_C

2020/07/10 06:22

Dim Values As String() = Split(~) for i = 1 to 10000 values = split(gyou(i),",") next i 'と書くとだいぶ早くなりました。 配列要素は書くものだとおもっておりました。 たすかりました。ありがとうごましました。
Zuishin

2020/07/10 06:25

解決したようですが、カンマよりも巨大なファイル全体を 10000 回スキャンしている方が問題なので、もっとずっと速くなると思います。
YAmaGNZ

2020/07/10 06:28

For ~ Dim values As String() = split(gyou(i),",") data1(i) = values(0) data2(i) = values(1) data3(i) = values(2) Next という感じになると思いますが・・・
Zuishin

2020/07/10 06:28

> File.ReadLinesメソッドを使う これで解決しますね。高評価します。
YAmaGNZ

2020/07/10 06:29

Zuishinさんの指摘部分もあって、ReadLinesを使ってはといった提案だったのですが、質問者さんに伝わってなさそうですね
guest

0

データをSQLインポートして実行すればかなり早くなるのでは?
言語は違いますがPythonで10万件処理するときに同じような問題にあたって上記の対応で1/10以下の速度になりました。

投稿2020/07/10 06:24

AMK

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

gyou(i) = Split(readstring, vbCrLf)(i) '一旦行を抜き出す インデックスは飛ばす 改行コードはvbCrLf

これがループ内にあるからです。ループに入る前に次を行い、ループの中では gyou(i) を使うだけにしてみてください。

VB.NET

1gyou = Split(readstring, vbCrLf) '一旦行を抜き出す インデックスは飛ばす 改行コードはvbCrLf

投稿2020/07/10 06:11

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問