stuncloud / UWSCR

UWSC互換スクリプト実行ツール
MIT License
54 stars 5 forks source link

CSVファイルの同一行で、最初に書き込んだ列以外へのFPUTが機能しない。 #178

Open DIYJii opened 6 months ago

DIYJii commented 6 months ago

概要

表題の通り

再現スクリプト

ID_CSV =  FOPEN("C:\Users\Public\Documents\CSV.txt",  F_Write or F_TAB)
                                                               //    結果              Should Be
FPUT(ID_CSV,1,1,1)                                             //  1                   1                                                                 
FPUT(ID_CSV,2,2,2) ; FPUT(ID_CSV,2,2,3)                        //      2                   2   2
FPUT(ID_CSV,3,3,3) ; FPUT(ID_CSV,3,3,4); FPUT(ID_CSV,3,3,5)    //          3                   3   3   3 

//FPUT(ID_CSV,4,1,1)                                           //  4                   4                                                                                       
//2回目のTestでは 左端にある //を外してTest     

FCLOSE(ID_CSV)

//ファイルを開いて目検

再現手順

No response

バージョン

1.0.1

不具合発生環境

Windows 10

stuncloud commented 6 months ago

@DIYJii 確認させてください

  1. UWSCではshould beの動作をするのでしょうか
  2. F_READ ありの場合にshould beのようになりますでしょうか

1がそうであればUWSCの動作に合わせます 2で改善しない場合はCSV書き込みの動作の見直しが必要になりそう

DIYJii commented 6 months ago

UWSCではshould beの動作をするのでしょうか : ハイ、 そうです。 F_READ ありの場合にshould beのようになりますでしょうか : イイエ、 変わりません。

UWSCとは無関係に、Should BeはCSVファイルに対するFPUTのあるべき動作と考えます。

On Thu, May 30, 2024 at 3:10 PM Joey Takahashi @.***> wrote:

@DIYJii https://github.com/DIYJii 確認させてください

  1. UWSCではshould beの動作をするのでしょうか
  2. F_READ ありの場合にshould beのようになりますでしょうか

1がそうであればUWSCの動作に合わせます 2で改善しない場合はCSV書き込みの動作の見直しが必要になりそう

— Reply to this email directly, view it on GitHub https://github.com/stuncloud/UWSCR/issues/178#issuecomment-2138752765, or unsubscribe https://github.com/notifications/unsubscribe-auth/BH6AXYSBHYFV4JNJI5PAZC3ZE27FTAVCNFSM6AAAAABIQGZT2CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMZYG42TENZWGU . You are receiving this because you were mentioned.Message ID: @.***>

stuncloud commented 6 months ago

📝 実装を見る限り同一行の複数列についても一応考慮してはいる感じ、想定外な動作になっている原因はコードからは読み取れない、要デバッグ 最後の書き込みではなく最初の書き込みのみが反映されてる理由も不明

stuncloud commented 6 months ago

話がそれますが


,,3,3,3

を書き込むのに

fput(fid, 3, 3, 3)
fput(fid, 3, 3, 4)
fput(fid, 3, 3, 5)

とするところを

fput(fid, [3,3,3], 3, 3)

と書けたらなんか便利そうな気がしたので気が向いたら実装してみようかと思います

DIYJii commented 5 months ago

話がそれますが ・・・

便利そうなものを、と考えて貰って有難うございます。

再現用コードは、実際に私が問題に遭遇した時のコードとは全く別で、ただ、説明用に書いた作り物です。 実際には、隣接したカラムに連続して複数の変数を入れる事は少なく、飛び離れたところにFputを掛けるか、全体をまとめてFputする事が殆どです。

私は、文章をデータとして扱っていますので、CSVファイルはF_TABで使っています。 そして、1つのレコードには、文章中で見つかったキーワードを表すインデックスを「,」カンマで繋いで、その塊を丸ごと1つのカラムに押し込んであります。(こんな感じ <#TAB>1,50,78,130<#TAB>)他にもレコードの属性を表すマーク等をカンマで繋いで1カラムに入れてあるのも有ります。 そのいずれも、後でそのカラムをFGET後、SPLITで分解して、キーワード関連の配列用インデックス等として使うという仕掛けです。

という事で、提案して頂いた新機能は、私としては今の処、無くても大丈夫ですが、他の人にも聞いてみてください。 折角、人の意を汲んでくれようとしたのに、こんな返事で申し訳ないのですが、又、宜しくお願いします。

On Thu, May 30, 2024 at 6:50 PM Joey Takahashi @.***> wrote:

話がそれますが

,,3,3,3

を書き込むのに

fput(fid, 3, 3, 3)fput(fid, 3, 3, 4)fput(fid, 3, 3, 5)

とするところを

fput(fid, [3,3,3], 3, 3)

と書けたらなんか便利そうな気がしたので気が向いたら実装してみようかと思います

— Reply to this email directly, view it on GitHub https://github.com/stuncloud/UWSCR/issues/178#issuecomment-2139187718, or unsubscribe https://github.com/notifications/unsubscribe-auth/BH6AXYX2YKEQ2RGYZO5XCXTZE3Y7PAVCNFSM6AAAAABIQGZT2CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMZZGE4DONZRHA . You are receiving this because you were mentioned.Message ID: @.***>

DIYJii commented 5 months ago

追伸: 4行目 「全体をまとめてFput」の部分 「"カラム・データを<#TAB>"で繋いで、全体をまとめてから1行分をFput」 

DIYJii commented 4 months ago

下記の様に、Test Caseを増やして調べてみました。

結論として、各Line毎に、最初の書き込みをしたFPUTのカラム番号で決まる、固定長仕様になっているように見えます。

という事で、最初のファイル作成時, 又は新しい行を追加する場合、下記の様にCSVの場合は","を、TSVの場合は"<#TAB>"を最大必要カラム数-1個並べたものを、各空白ラインに書き込んでおく事で、取り敢えずは問題回避出来そうです。

    FPUT(ID_CSV,",,,," ,LineNo)  or  FPUT(ID_CSV,"<#TAB><#TAB><#TAB><#TAB>" ,LineNo)

////////////////////////////////////////////////////////////////////////////////////

// Test case 1 同一Line上で、最初に書き込んだカラム以降には書き込めない。(本問題提起Case)   ID_CSV = FOPEN("C:\Users\Public\Documents\CSV.txt", F_WRITE)                 // UWSCR // UWSC
FPUT(ID_CSV,1,1,1)                // 1 // 1
FPUT(ID_CSV,2,2,2) ;FPUT(ID_CSV,2,2,3)            // ,2 // ,2,2
FPUT(ID_CSV,3,3,3) ; FPUT(ID_CSV,3,3,4); FPUT(ID_CSV,3,3,5)        // ,,3 // ,,3,3,3

FCLOSE(ID_CSV) MSGBOX("1. Check CSV.txt")

// Test case 2   カラム数の大きい方から書き込むとOK。

ID_CSV = FOPEN("C:\Users\Public\Documents\CSV.txt", F_WRITE)

FPUT(ID_CSV,1,1,1)                // 1 // 1
FPUT(ID_CSV,2,2,3) ;FPUT(ID_CSV,2,2,2)            // ,2,2 // ,2,2
FPUT(ID_CSV,3,3,5) ; FPUT(ID_CSV,3,3,4); FPUT(ID_CSV,3,3,3)        // ,,3,3,3 // ,,3,3,3

FCLOSE(ID_CSV) MSGBOX("2. Check CSV.txt")

// Test case 3 既に書き込み済のファイルでは、書き込む順番は若い方からでもOK。

ID_CSV = FOPEN("C:\Users\Public\Documents\CSV.txt", F_WRITE or F_READ)
FPUT(ID_CSV,1,1,1)             // 1 // 1
FPUT(ID_CSV,2,2,2) ;FPUT(ID_CSV,2,2,3)         // ,2,2 // ,2,2
FPUT(ID_CSV,3,3,3) ; FPUT(ID_CSV,3,3,4); FPUT(ID_CSV,3,3,5)      // ,,3,3,3 // ,,3,3,3

FCLOSE(ID_CSV) MSGBOX("3. Check CSV.txt")

// Test case 4 但し、既に書き込み済のファイルでは、以前に書き込んだカラム数以上には書き込めない。   ID_CSV = FOPEN("C:\Users\Public\Documents\CSV.txt", F_WRITE or F_READ)
FPUT(ID_CSV,3,1,3) ; FPUT(ID_CSV,3,1,4); FPUT(ID_CSV,3,1,5) // 1 //1,,3,3,3 FPUT(ID_CSV,2,2,2) ; FPUT(ID_CSV,2,2,3)    // ,2,2 // ,2,2 FPUT(ID_CSV,1,3,1)      // 1,,3,3,3 // 1,,3,3,3

FCLOSE(ID_CSV) MSGBOX("4. Check CSV.txt")

.ps 不勉強でレイアウトの調整ができず、//以下のUWSCRとUWSCの結果表示が判りにくくなっています。悪しからず。

stuncloud commented 3 months ago

201 でfputの実装を変更するついでに直る見込み