|
お世話になっております。 csvからcsvへの転記したいのですが、もう少し早くなる方法はありませんでしょうか? 以前教えて頂いたfindstrとdoscmdを組み合わせた方法でやっているのですが、4分ぐらい掛かります。
ご教授お願いします。
dim f = "余剰梱包.csv"
GETTIME() print G_TIME_NN+" "+G_TIME_SS+" スタート"
在庫転記(f)
GETTIME() print G_TIME_NN+" "+G_TIME_SS+" 終了"
PROCEDURE 在庫転記(f) ex = fopen(f,F_READ or F_WRITE) For p = fget(ex,-1) TO 3 STEP -1 抽出 = fopen("temp.csv", f_write) fput(抽出, trim(doscmd("findstr <#dbl>" + trim(fget(ex,p,1)) + "<#dbl> 在庫.CSV"))) fclose(抽出)
id = fopen("temp.csv") For i = 1 to fget(id,F_LINECOUNT) ifb trim(fget(ex,p,1)) = trim(fget(id,i,10)) then fput(ex,trim(fget(id,i,23)),p,14) fput(ex,trim(fget(id,i,25)),p,15) break endif next fclose(id) next fclose(ex) fend
//余剰梱包.csv //2439行 //梱包,削減,予備,帳簿,21/11/06,機種,追加,引当,在庫2F,種類,状況,待ち,当,フリー,引当,上棚7★,待ち棚7,差棚7,S_,T_ //aaaa,0,0,0,ブラケット,,,,,,,0,0,0,0,0,0,0,, //bbbb,0,0,2,ブヒンバコ,,,2020/5/11,,,部品箱,1,1,5,0,0,1,0,,
//在庫.CSV //1474行 //一覧表,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 //倉庫,倉庫名称,荷主,荷主名称,1,2,3,4,5,コード,名称,規格1,規格2,規格3,規格4,No,数量1,数量1荷姿名称,数量2,数量2荷姿名称,数量3,数量3荷姿名称,在庫数,移動中数,引当数,出荷止数,重量,容積,基準日,出荷許容日,賞味期限切れ //110,e,1,t,1,,,,,aaaa,1ダン2ガタ タナイタ1200,,,,,,4,個,0,,0,,4,0,0,0,4,4,,, //110,e,1,t,1,,,,,bbbb,1ダン2ガタ タナイタ1500,,,,,,1,個,0,,0,,1,0,0,0,1,1,,, //110,e,1,t,1,,,,,cccc,1ダン2ガタ ワク2ホン,,,,,,4,個,
//結果 //40 12 スタート //43 55 終了
|
No.1398 2021/11/07(Sun) 08:54:15
|
☆ Re: / stuncloud |
|
|
|
こちらで作成したサンプルCSVファイルでの結果は以下となりました
dim f = "余剰梱包.csv" s = GETTIME() 在庫転記(f) print (GETTIME() - s) + "秒" // 約80秒 s = GETTIME() 在庫転記fixed(f, "在庫.CSV") print (GETTIME() - s) + "秒" // 約50秒
極力ファイルの読み書きを減らすために配列を使いましたが思ったほど早くならないですね… splitを使うのでCSV内にダブルクォートや余計なカンマがあると正常動作しなくなるという弱点もあります
例: ほげ,"ふ,が",ぴよ csv的には ほげ ふ,が ぴよ になってほしいが ほげ "ふ が" ぴよ の4要素になってしまう
procedure 在庫転記fixed(余剰梱包, 在庫, outfile = EMPTY) fid = fopen(余剰梱包, F_READ) A余剰梱包 = split(fget(fid, F_ALLTEXT), "<#CR>") fclose(fid) fid = fopen(在庫, F_READ) A在庫 = split(fget(fid, F_ALLTEXT), "<#CR>") fclose(fid)
for i = length(A余剰梱包) - 1 to 2 step -1 余剰梱包行 = split(A余剰梱包[i], ",", false, false) for row in A在庫 在庫行 = split(row, ",") if trim(在庫行[9]) = trim(余剰梱包行[0]) then 余剰梱包行[13] = trim(在庫行[22]) 余剰梱包行[14] = trim(在庫行[24]) break EndIf next A余剰梱包[i] = join(余剰梱包行, ",") next if outfile = EMPTY then outfile = 余剰梱包 endif fid = fopen(outfile, F_WRITE) fput(fid, join(A余剰梱包, "<#CR>")) fclose(fid) fend
ともあれCSVファイルがそこまで巨大なのであればCSVではなくデータベースを使ったほうが良い気がします (UWSCからでもデータベースを扱う方法はあります)
あるいはExcelでLOOKUP系の関数などを使えば簡単に望んだ結果が得られそうです Excel処理の自動化(CSV取り込み、数式埋め込みなど)はVBAでもUWSCでもできますしね
|
No.1399 2021/11/08(Mon) 12:20:21
|
|
☆ Re: / By(バイ) |
|
|
|
senさんこんにちは。
なぜ余剰梱包.csvを逆読みで、しかも3行目までしか読まないのか不思議でしたが、そのままにしてます。
以下の方法ではどうでしょうか? 私の環境では秒殺でした。(^_^)V
//---------------------------------------- dim f = "余剰梱包.csv"
GETTIME() print G_TIME_NN+" "+G_TIME_SS+" スタート"
在庫転記_改(f)
GETTIME() print G_TIME_NN+" "+G_TIME_SS+" 終了"
Procedure 在庫転記_改(f) Hashtbl 在庫数 fid = Fopen("在庫.CSV", F_READ) For i = 2 To Fget(fid, F_LINECOUNT) If 在庫数[Fget(fid, i, 10), HASH_EXISTS] Then Continue 在庫数[Fget(fid, i, 10)] = trim(Fget(fid, i, 23)) + "," + trim(Fget(fid, i, 25)) Next Fclose(fid) ex = fopen(f,F_READ or F_WRITE) For p = fget(ex,-1) TO 3 STEP -1 If 在庫数[fget(ex, p, 1), HASH_EXISTS] Then 数 = Split(在庫数[fget(ex, p, 1)], ",") fput(ex, 数[0], p, 14) fput(ex, 数[1], p, 15) Endif next fclose(ex) fend
|
No.1400 2021/11/10(Wed) 19:03:58
|
|