2016-07-01 23 views
0

我是新手,.NET,我在SSIS中使用腳本任務。我正在嘗試將文件加載到具有如下所示字符的數據庫中。這看起來像從字複製一個數據,其中 - 已經轉向 -c#.net正則表達式刪除某些非ASCII字符不起作用

示例文本: 校正 - 春節促銷2016

記事本++顯示: Sample text

我用正則表達式在.NET腳本[^\x00-\x7F]但即使它落在它被取代的範圍內。我不希望這些角色被改變。我在這裏錯過了什麼?

如果我不替換,我會得到一個截斷錯誤,因爲我相信這些字符的尺寸不止一個。

編輯:我添加了示例行。前兩行有問題,最後兩行沒問題。

123|NA|0|-.10000|Correction – Spring Promo 2016|.000000|gift|2013-06-29 
345|NA|1|-.50000|Correction–Spring Promo 2011|.000000|makr|2012-06-29 
117|ER|0|12.000000|EDR - (WR) US STATE|.000000|TEST MARGIN|2016-02-30 
232|TV|0|.100000|UFT/MGT v8|.000000|test. second|2006-06-09 

經過良好的長週末:)我開始認爲這是由於代碼頁錯誤。加載平面文件時的確切錯誤消息如下。

錯誤:數據轉換失敗。 「NAME」列的數據轉換返回狀態值4,並且狀態文本「文本被截斷或者一個或多個字符在目標代碼頁中不匹配」。

這就是我在我的ssis包中所做的。

  1. 驗證平面文件的腳本任務。
    • 影響文件內容的唯一驗證是檢查文件中分隔列的數量與該文件應該使用的數量相同。我需要閱讀每行(如果有額外的管道分隔符(用戶條目),從文件中刪除該行並將其記錄到自定義表中)。
    • 使用StreamWriter類,我將所有有效行寫入臨時文件,並在最後重命名/移動文件。
    • 道歉,但我剛剛注意到,這個過程改變了上述所有這樣的行,像這樣。

Notepad: Correction � Spring Promo 2016

如何停止我的腳本任務,這樣做呢? (這應該是解決方案)

如果這並不容易,選項2是.. 我的連接管理器是平面文件源和OLEDB目的地。 OLEDB使用的默認代碼頁是。如果這些字符在代碼頁1252中不匹配,我應該使用什麼?是否有其他解決方法而不更改代碼頁?

腳本任務:

     foreach (string file in files)... some other checks 
         { 
         var tFile = Path.GetTempFileName(); 
         using (StreamReader rFile = new StreamReader(file)) 
         using (var swriter = new StreamWriter(tFile)) 
         { 
         string line; 
          while ((line = rFile.ReadLine()) != null) 
          { 
           NrDelimtrInLine = line.Count(x => x == '|') + 1; 
           if (columnCount == NrDelimtrInLine) 
           { 
            swriter.WriteLine(line); 
           } 
           }}} 

太謝謝你了。

+1

它可能不會傷害看到上下文您的腳本任務/組件可確保我們的假設與您的假設保持一致 – billinkc

+0

您可以使用'[\ u801} \ u10fff}]來標識非ascii,然後用_entities_替換它們,即'&#'(十進制或xHEX)';'如果它是html。或者,您可以將它們轉換爲Unicode字符串字符,例如您的字符串變爲'Correction \ u2013 Spring Promo 2016'。這完全取決於渲染文本顯示的內容。如果你期望字符大於0xFFFF,你可以考慮使用'\ Uxxxxxxxx'。但是,這隻會在編譯時適用於文字。 – sln

+0

是的,你應該做的第一件事就是獲取char代碼。然後你可以繼續正則表達式。轉換爲十六進制或其他實體表示並更新問題。 –

回答

1

由於「我不希望這些字符被改變」似乎與「它們必須被替換以避免截斷」相互排斥,所以我不清楚你打算如何。我需要看代碼給你進一步的建議。

一般來說,我建議總是先測試代碼之外的正則表達式模式。我通常使用http://regexr.com

如果要匹配你的特殊字符: Matching Your Special Characters

如果你想除了你的特殊字符來匹配任何東西: Matching Non-Special Characters