|
いつもお世話になっております。 下記の様な感じで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
|
|
☆ Re: csvからcsvへデータ移動 / sen |
|
|
>終わりから回す。出力は常に1行目に。 これです。ドンピシャです。 質問出来てなかったのですが、バックアップの時は、追加したデータが上にくると見やすいです。
>FGet(入力, 行) もやもやしていたのが、クリアになりました。 実質、2行で移動が出来るのは、最高です。
これで、csvからcsvへデータ移動が自由自在にできそうです。 有り難うございました。
PROCEDURE Pバックアップ(VAR 業者名) 出力 = fopen("D:\bak" + 業者名 + ".csv", F_READ or F_WRITE) 入力 = fopen("D:\" + 業者名 + ".csv", F_READ or F_WRITE) for 行 = fget(入力, F_LINECOUNT) to 2 step -1 ifB fget(入力,行,10) <> "" then fput(出力,FGet(入力,行),2,F_INSERT) fdelline(入力,行) ENDIF NEXT fclose(入力) fclose(出力) fend
追伸 ヘルプの「F_INSERT」の説明を行のところにしてもらえると分かりやすいです。 // ファイル 書き込み FPUT( ファイルID, 書込み値, [行, 列] ) 引数 ファイルID: オープン時に返されたID 書込み値: 書込み内容 行: 書込み行 (1から指定) 0 (デフォルト)で行末に追加 F_ALLTEXT を指定した場合は行ではなくファイルの全内容として書き込む ←ここへ 列: 書込み列 (1から指定:,カンマ区切りのCSVファイルに対応) F_INSERT を指定した場合は指定行に挿入 ← これを
※ 注:実際にファイルが更新されるのは FCLOSEが呼ばれた時です
|
No.353 2014/11/03(Mon) 12:18:53
|
|
☆ Re: csvからcsvへデータ移動 / しろまさ |
|
|
>ヘルプの「F_INSERT」の説明を行のところにしてもらえると分かりやすいです。 それはダメでしょう。
列:(第四引数)に指定するべき定数の説明だから列の欄に書かなければ。 行:の欄に書いたら第三引数にセットするという意味になってしまいます。
F_INSERTを定数値で考えるとどうですか? 「列番号を指定しない」and「挿入する」から -1 を入れるのだという考えです。 fput(出力,書込み値,1,-1)
ちなみに列番号 0 指定は、省略(列番号を指定しない)と同意みたいですね。
|
No.367 2014/11/05(Wed) 09:01:26
|
|
☆ Re: csvからcsvへデータ移動 / sen |
|
|
>fput(出力,書込み値,1,-1) よく分かりました。 有り難うございました。
|
No.393 2014/11/09(Sun) 20:52:28
|
|