2

良い一日。以下は、ファイルのエンコーディングをチェックし、ファイルからデータを取得する Powerbuilder スクリプトです。データが string variable( ) に割り当てられるls_encodingと、オブジェクト関数に渡されof_TabDelimited()(この関数のスクリプトも以下に示されています)、パイプ区切りがタブ区切りに置き換えられます。

オブジェクト関数内of_TabDelimited()で、アプリケーションがハングアップし、PB ハングアップの原因がわかりません。渡されたデータは約 2,800 行です。ただし、of_TabDelimited()データがより大きな行(たとえば100行)にない場合、関数は正常に機能しています。of_TabDelimited()ループ内でループと置換機能を実行するだけなので、処理の制限は見つかりません。

エラーを見つけて修正する方法を教えてくれる人はいますか? どんな助けにも感謝します。

//Get the data from the file
ll_FileNum = FileOpen(ls_sourcepath, StreamMode!, Read!, LockWrite!, Replace!)
ll_FileLength = FileLength(ls_sourcepath)
eRet = FileEncoding(ls_sourcepath)
IF NOT ISNULL(ll_FileLength) OR ll_FileLength > 0 THEN  
    IF eRet = EncodingANSI! THEN 
        ll_bytes = FileReadEx(ll_FileNum, lbl_data)     
        ls_Encoding = String(lbl_data, EncodingUTF8!)   
        FileClose(ll_FileNum)
    END IF
ELSEIF ISNULL(ll_FileLength) OR ll_FileLength = 0 THEN 
    lb_Return = FALSE
END IF

Integer li_start, li_end
//Convert the data to TabDelimited
ls_Return = of_TabDelimited(ls_Encoding) //Application hang-up on this function.
IF NOT ISNULL(ls_Return) OR LEN(ls_Return) > 0 THEN 
    //Parse To Table
END IF


Function        : of_TabDelimited
Return Type     : String
Argument Type   : as_encoding

Long ll_start=1
String ls_old, ls_new
ls_old = "|"
ls_new = "~t"

// Find the first occurrence of old_str.
ll_start = POS(as_encoding, ls_old, ll_start)

// Only enter the loop if you find old_str.
DO WHILE ll_Start > 0
     // Replace old_str with new_str.
     as_encoding = Replace(as_encoding, ll_start, Len(ls_old), ls_new)

    // Find the next occurrence of old_str.
    ll_start = POS(as_encoding, ls_old, ll_start + Len(ls_new))
LOOP    

RETURN as_encoding

以下は、アプリケーションに追加してテストした新しい機能です。そして、このスクリプトは正常に機能しているようで、多数の行を処理できます。基本的に、このスクリプトは、オブジェクト n_cst_string の PFC の関数 of_GlobalReplace() から取得されました。of_TabDelimited() のスクリプトでさえ of_GlobalReplace() から取られたものですが、違いは変数 ls_old と ls_new での len() の計算です。

String ls_Source, ls_Old, ls_New
Long ll_Start, ll_Oldlen, ll_Newlen
ls_Old = "|"
ls_New = "~t"

//Script taken from n_cst_string - of_GlobalReplace
//Get the string lenghts
ll_OldLen = Len(ls_Old)
ll_NewLen = Len(ls_New)

//Search for the first occurrence of as_Old
ll_Start = Pos(as_source, ls_Old)

Do While ll_Start > 0
    // replace as_Old with as_New
    as_Source = Replace(as_Source, ll_Start, ll_OldLen, ls_New)

    // find the next occurrence of as_Old
    ll_Start = Pos(as_source, ls_Old, (ll_Start + ll_NewLen))
Loop

Return as_Source
4

1 に答える 1

0

PFC の of_GlobalReplace() 関数を確認し、そこからスクリプトをコピーしましたが、大文字と小文字の区別のチェックを削除しました。以下の関数をテストしましたが、ファイルから大量のデータを処理する際に問題なく動作しています。

String ls_Source, ls_Old, ls_New
Long ll_Start, ll_Oldlen, ll_Newlen
ls_Old = "|"
ls_New = "~t"

//Script taken from n_cst_string - of_GlobalReplace
//Get the string lenghts
ll_OldLen = Len(ls_Old)
ll_NewLen = Len(ls_New)

//Search for the first occurrence of as_Old
ll_Start = Pos(as_source, ls_Old)

Do While ll_Start > 0
    // replace as_Old with as_New
    as_Source = Replace(as_Source, ll_Start, ll_OldLen, ls_New)

    // find the next occurrence of as_Old
    ll_Start = Pos(as_source, ls_Old, (ll_Start + ll_NewLen))
Loop

Return as_Source
于 2015-11-04T08:01:31.327 に答える