2014-01-06 38 views
0

我有一個文本標籤分隔文件,該文件使用帶有ImportFile()方法的DataStore導入到PB中。輸入過程中沒有錯誤,但當我檢查表時,破折號字符變成無效字符(?)。該表的列是varchar(300)數據類型。PowerBuilder - 短劃線字符變成無效字符

任何幫助/建議表示讚賞。

enter image description here

當我檢查數據庫,結果集是:

enter image description here

下面是導入文件的腳本,我目前正在實施。

//Import File Script 
IF (ids_edihdr.ImportFile(ls_SourcePath,1,1) = 1) AND (ids_edidtl.ImportFile(ls_SourcePath,2) > 0) THEN 
    //HEADER 
    IF ids_edihdr.RowCount() = 1 THEN 

     ids_edihdr.SetItem(1,'FNAME',Upper(as_file)) 
     ids_edihdr.SetItem(1,'CREATEDBY',Upper(SQLCA.LogID))  
     ids_edihdr.SetItem(1,'CREATEDDATE',idt_TranDate)  

    END IF 

    //DETAIL 
    IF ids_edidtl.RowCount() >= 1 THEN 
     FOR ll_edidtl = 1 TO ids_edidtl.RowCount() 
      ids_edidtl.SetItem(ll_edidtl,'Fname',Upper(as_file)) 
      ids_edidtl.SetItem(ll_edidtl,'CREATEDBY',Upper(SQLCA.LogID))  
      ids_edidtl.SetItem(ll_edidtl,'CREATEDDATE',idt_TranDate) 
     NEXT   
    END IF 
END IF 

回答

0

該文件導入的任何機會是在Word或Excel中輸入的數據?你有沒有用十六進制編輯器查看數據文件?奇數字是用一個擴展字符「智能地」替換的,並且你有一個字符集衝突發生。我的賭注是修復數據文件,而不是代碼。

祝你好運,

特里

+0

通過在十六進制編輯器中查找文件,我發現破折號被這個字符替代: - 。感謝您提到了十六進制編輯器。這也得出結論,即使該字符已成功保存到數據庫表中,數據文件仍然需要修復。 – Alex

0

我做了一點點研究,並得知有問題的字符是一個統一劃線 U + 002D。現在,如果數據在輸入文件中看起來很好,並且在導入問題時已損壞,可能是由於PB沒有將數據作爲Unicode處理,因此您可以使用PB中的函數修復這種情況。

可能是ANSII和Unicode之間的database interface you are using doesn't support the conversion(見第7頁)..不知道如果你使用一個管道對象或任何地方的數據庫驅動程序來發揮作用。

無論哪種方式知道它是一個字符編碼問題,解決這個問題應該很簡單,只需使用「EncodingASNI!」即可。或「EncodingUnicode!」在將文本導入數據窗口之前,在String和Blob方法上枚舉參數。如果這是不可能的,那麼您可以編寫快速例程來讀取文件,轉換並保存,然後再導入。

如果您不想在導入之前進行轉換,則可以在實際執行數據庫更新之前通過循環訪問數據窗口/數據存儲區來完成此操作。

你可以找到examples of code on my blog on converting between ANSI and Unicode,但基本上你只是在String和Blob函數中使用這些編碼參數之一。

  • EncodingANSI!
  • 編碼UTF8!
  • EncodingUTF16LE! - UTF-16 Little Endian編碼(PowerBuilder 10默認)
  • EncodingUTF16BE! - UTF-16 Big Endian編碼
0

欣賞所有評論。我想分享一下我是如何解決這個問題的。我已經添加了一個腳本來處理文件編碼驗證和轉換。

ll_FileNum = FileOpen(ls_sourcepath, StreamMode!, Read!, LockWrite!, Replace!) 
ll_FileLength = FileLength(ls_sourcepath) 
eRet = FileEncoding(ls_sourcepath) 
IF eRet = EncodingANSI! and ll_filelength <= 32765 THEN 
    li_bytes = FileReadEx(ll_FileNum, lbl_data)  
    ls_unicode = String(lbl_data, EncodingUTF8!)  
    FileClose(ll_FileNum) 
END IF 

    IF (ids_edihdr.ImportString(ls_unicode,1,1) = 1) AND (ids_edidtl.ImportString(ls_unicode,2) > 0) THEN 
     <some conditions here....> 
    END IF 
相關問題