2016-07-01 4 views
0

私はSSHでスクリプトタスクを使用しています。私は以下のようないくつかの文字を持っているデータベースにファイルをロードしようとしています。私は、.NETスクリプト[^\x00-\x7F]で正規表現を使用しますが Sample textC#。ASCII以外の文字を削除する正規表現は動作しません。

: - 春のプロモ2016

メモ帳++ショー 補正: - になっている -

をサンプルテキストこれは、Wordからコピーされたデータのように見えます範囲内であっても置き換えられます。私はこれらの文字を変更したくありません。私はここで何が欠けていますか?

私が置き換えないと、これらの文字がビットサイズ以上を占めると考えられるため、切り捨てエラーが発生します。

編集:サンプル行を追加しました。最初の2行に問題があり、最後の2行に問題はありません。

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およびステータス・テキスト「テキストが切り捨てられたか、または1つ以上の文字がターゲット・コード・ページに一致しませんでした。」が戻されました。

これは私の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

'[\ u {80} - \ u {10ffff}]'を使って非ASCII文字を識別し、_entities_、すなわち '&#'(10進またはxHEX) ';'それがhtmlになる場合。または、それらをUnicode文字列に変換することができます。たとえば、文字列が「Correction \ u2013 Spring Promo 2016」になります。それは、テキストの表示を何が表示しているかによって異なります。そして、0xFFFFより大きい文字を期待するならば、 '\ Uxxxxxxxx'を使うことを検討するかもしれません。しかし、これはコンパイル時にリテラルにしか当てはまりません。 – sln

+0

はい、最初にすべきことは、charコードを取得することです。その後、正規表現を進めることができます。 16進数または他のエンティティ表現に変換し、質問を更新します。 –

答えて

1

"私はこれらの文字を変更したくない"ので、あなたが意図していることは明らかではありません。「切り捨てを避けるために置き換えなければならない」と相互に排他的です。あなたにさらなるアドバイスを与えるためにコードを見る必要があります。

一般に、正規表現以外のパターンは、まずコードの外側でテストすることをおすすめします。 Matching Your Special Characters

あなたは特殊文字以外のものを一致させたい場合は:あなたはあなたの特別な文字を一致させたい場合は、私は通常

http://regexr.comを使用 Matching Non-Special Characters

それはおそらくの状況を見て損はない
関連する問題