良い一日。以下は、ファイルのエンコーディングをチェックし、ファイルからデータを取得する 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