|
いつもお世話になっております。 下記の様な感じで10列目に文字があれば、バックアップファイルに転記しているのですが、 時々、転記漏れがあるので、十回ループしてます。 どこかに、sleepを入れたら良いのかなと思ったりもしたのですが、うまくいきません。 御教授いただけませんでしょうか?
dim 抽出業者[] = "a","b" dim 業者名[] = "a業者","b業者"
for x = 0 to 10 FOR Y = 0 to length(抽出業者[])-1 Pバックアップ(抽出業者[y],業者名[y]) next next
PROCEDURE Pバックアップ(VAR 抽出業者 , VAR 業者名) 出力 = fopen("D:\bak一覧_" + 業者名 + ".csv", F_READ or F_WRITE) 入力 = fopen("D:\一覧_" + 業者名 + ".csv", F_READ or F_WRITE) dim 表題[] = 業者名 +"施工/"+"得意先","届け先","機種","納品日","備考","社内メモ","受注番号","・","予定日","完了日" for 行 = 2 to fget(入力, F_LINECOUNT) ifB fget(入力,行,10) <> "" then //工事済みの時 データ = "" for 列 = 1 to 10 データ = データ + "," + fget(入力,行,列) next fput(出力, copy(データ, 2) + ",,", 0) // データを1行追加 FDELLINE(入力,行) //転記分を削除 ENDIF NEXT fclose(入力) fclose(出力) fend
|
No.335 2014/10/29(Wed) 00:33:36
|
☆ Re: csvからcsvへデータ移動 / 森 |
|
|
> FDELLINE(入力,行) //転記分を削除 をすることによって、以降の行が繰り上げになり、 削除した次行の処理が飛んでしまっているのが原因ですね。
▼分かりやすく再現
data.csv ------------------------- 1 2 3 4 5 6
test.uws ------------------------- f = fopen("data.csv",F_READ or F_WRITE) for i = 1 to fget(f,F_LINECOUNT) msgbox(fget(f,i)) fdelline(f,i) next fclose(f)
|
No.337 2014/10/29(Wed) 09:56:59
|
|
☆ Re: csvからcsvへデータ移動 / Liners |
|
|
>削除した次行の処理が飛んでしまっているのが原因ですね。 確かに。では結局どうすればよいのか?…移動なのだから削除自体が悪い訳でなく行を移動しなければ良い。
データがないので確認できないが、単純にifbをwhileに置換える。
ifB fget(入力,行,10) <> "" then -> while fget(入力,行,10) <> "" ENDIF -> wend
|
No.338 2014/10/29(Wed) 21:24:10
|
|
☆ Re: csvからcsvへデータ移動 / しろまさ |
|
|
> では結局どうすればよいのか? 終わりから回す。出力は常に1行目に。
for 行 = fget(入力, F_LINECOUNT) to 2 step -1 ・ fput(出力, copy(データ, 2) + ",,", 1, F_INSERT) // データを1行目に挿入
話は変わりますが、これ↓だと1列目の前にも , が付きますので処理が増えてますね。 データ = "" for 列 = 1 to 10 データ = データ + "," + fget(入力,行,列) next ・・・・・・・copy(データ, 2)・・・
ループ取得と文字列結合は処理を遅くする(uwscの不得意分野)ので、
1行全て取得するにはこれ↓ FGet(入力, 行)
10桁以上あって10桁目まで取得したいならこれ↓ Copy(FGet(入力, 行), 1, Pos(",", FGet(入力, 行), 10) - 1)
な感じで取得すると効率いいですよ。
|
No.339 2014/10/30(Thu) 09:03:22
|
|