|
お世話になっております。 15万行のエクセルを変数に読み込ませるにあたり以下のように書いています。 この書き方だとものすごく時間がかかるため、一気に配列変数に入れられないかと 考えています。 どなたかお知恵を拝借いたしたく、アドバイスを頂けると大変助かります。
EXCEL = CREATEOLEOBJ("EXCEL.Application") EXCEL.visible = True Excel.WorkBooks.Open(FileName :="AAA.csv", readOnly :=False) Sleep(5)
for i = 1 to 150000
BBB[i] = EXCEL.RANGE("B" + i).value CCC[i] = EXCEL.RANGE("C" + i).value DDD[i] = EXCEL.RANGE("D" + i).value
next
EXCEL.ActiveWindow.Close(True) Excel.quit
|
No.2913 2016/09/22(Thu) 18:59:18
|
☆ Re: エクセルデータを一括で読み込む方法 / リキュール |
|
|
変数に読み込ませるだけならエクセルをオープンする必要は無いと思います。
fid= FOPEN("AAA.csv",F_READ) dim BBB[150000] dim CCC[150000] dim DDD[150000] for i = 1 to 150000 BBB[i] = FGET(fid,i,2) CCC[i] = FGET(fid,i,3) DDD[i] = FGET(fid,i,4) next FCLOSE(fid)
|
No.2914 2016/09/22(Thu) 20:54:25
|
|
☆ Re: エクセルデータを一括で読み込む方法 / Nagatani |
|
|
Pro版でしたら下記の手もあります! EXCEL = CREATEOLEOBJ("EXCEL.Application")
//遊び半分非表示処理 EXCEL.visible = False Excel.WorkBooks.Open(FileName :="Book1.csv", readOnly :=False) XLACTIVATE(Excel, "Sheet1")
//配列に取り込み(数秒?) dd = XLGETDATA(Excel, "A1:C150000")
//取り込んだ内容を確認 FOR LonI1 = 1 TO 40 PRINT LonI1 + " A= " + DD[LonI1,1] +" B= " + DD[LonI1,2] + "C= " + DD[LonI1,3] NEXT
EXCEL.ActiveWindow.Close(True) Excel.quit
15万行は確認してません!
|
No.2915 2016/09/22(Thu) 21:26:50
|
|
☆ Re: エクセルデータを一括で読み込む方法 / 俄プログラマー |
|
|
データの行列を入れ替え出来るなら
fid = FOPEN("aaa.csv",F_READ) BBB = SPLIT(FGET(fid,1),",") CCC = SPLIT(FGET(fid,2),",") DDD = SPLIT(FGET(fid,3),",") FCLOSE(fid)
|
No.2917 2016/09/22(Thu) 22:03:01
|
|
☆ Re: エクセルデータを一括で読み込む方法 / まさ |
|
|
リキュール様、Nagatani様、俄プログラマー様
誠にありがとうございます! どれも早くなりました。
配列には入ったのですが、その後、キーワードを探すところで結局for文でまわして 時間がかかってします。
AAA[]配列からキーワードの配列番号を早く取り出す方法はないでしょうか。
for i = 1 to 150000 ifb AAA[i] = "TEST" then XXXXX endif next
|
No.2918 2016/09/22(Thu) 22:25:50
|
|
☆ Re: エクセルデータを一括で読み込む方法 / 俄プログラマー |
|
No.2919 2016/09/22(Thu) 23:00:41
|
|
☆ Re: エクセルデータを一括で読み込む方法 / 俄プログラマー |
|
|
連想配列で片付けましたが 配列を使わず検索する方法です。 一旦変数にファイルのデータを全て入れ POSで検索したいキーの位置を探しその行のデータのみに絞ります。 ただし複数ヒットする場合、列2、3以降にもキーにヒットする場合を考慮してませんので 改行やカンマなど利用して工夫してください。(重複ありなしデータ内容のヒントが無いので) 3列16万行のデータでかかった時間は読み出しから表示まで1秒未満でした。 検証データの内容は単純に 1,1,1 2,2,2 ・ ・ ・ 160000,160000,160000 で検証しました。 (先の回答の行列は入れ替えしなくて良いです。)
key = "TEST"
fid = FOPEN("aaa.csv",F_READ) value = FGET(fid,F_ALLTEXT) FCLOSE(fid)
検索位置 = POS(key,value) if 0 < 検索位置 then text = copy(value,検索位置)//キー位置以降をコピー 改行位置 = POS("<#CR>",text)//改行までのデータに絞る為 print copy(text,1,改行位置) else print "ヒット無し" endif
|
No.2920 2016/09/23(Fri) 02:31:50
|
|
☆ Re: エクセルデータを一括で読み込む方法 / まさ |
|
|
俄プログラマー様
早速のご回答ありがとうございます!! 格段に速くなりました!
|
No.2921 2016/09/23(Fri) 03:04:08
|
|