2011/04/23(Sat) 18:56:19 編集(投稿者)
2011/04/23(Sat) 16:32:22 編集(投稿者)
■No58673 (腹痛中 さん) に返信
> みきぬ様
>
> 簡単に言うとやりたい事はずばりそうなのですが、それで完結というわけじゃないので
> ソースがあるとありがたかったです。
VBのソースがないだけで、C#のソースは提示のURLに載っていましたよ?
(文法は違いますが、RichTextBox.Rtfプロパティを使うという要点は十分に読み取れるかと思います)
■No58709 (腹痛中 ※未解決 さん) に返信
> shu様のソースでは、正常に変換する事が可能なのですが、処理速度的に問題がありました。
提示のソースコードが何をしているかは理解されていますか?
またその上で、期待通りの動作になっているか検証もしましょう。
処理速度の話はおいといて、
「「500001355{\rtf・・・」のデータはそのままで、文字変換できなかったデータ(\'95\'a0\'92\'c9・・・)のみ変換する事は可能なのでしょうか?」
という仕様からは、少しだけ期待しない結果になっていますので。
> 1件処理するのに、何十秒もかかることがあります。
提示のソースコードそのままかどうかわかりませんが、
ソースコードのどこがどれだけ処理がかかっているのか検証しましたか?
> 変換不要な箇所を事前に削ってみたりしてみたのですが業務で使用するのにはかなり厳しいです。
闇雲にいじるのではなく、何がボトルネックになっているのかをまず見極めなければ、
処理の最適化・高速化はできません。
質問文からは大量データを扱うなどの話はでてきていませんので、
shuさんのサンプルコードはそういった点は特に考慮されていないと思います。
「strDes &=」といように&演算子で文字列結合するのをやめてStringBuilderクラスを使えば
おそらく早くなるのではと思いますが、これは未検証です。
> 正規表現部分の改造も試みているのですが、さらに良い知識があればお願いいたします。
別案としてRegex.Replaceを使うという手があります。shuさん版より速いかどうかは未検証ですので、検証してくださいね。
詳しくはMSDNライブラリの以下を調べましょう。
http://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.regex.replace.aspx
' ※変数名とかメソッド名とか適当だから、くれぐれもこのコードそのままを実業務に適用しないように
Private encode As Encoding = Encoding.GetEncoding("Shift-JIS")
Private buf As Byte? ' Shift_JISの全角1バイト目を保管しておくバッファ。Nothingで初期化して使うこと
Private Function ConvertRtf(ByVal strSrc As String)
buf = Nothing
Return Regex.Replace(strSrc, "\\'(?<DT>..)", AddressOf Evaluator)
End Function
' Regex.ReplaceのMatchEvaluatorデリゲート用のメソッド
Private Function Evaluator(ByVal match As Match) As String
Dim replacement As String
Dim tmp As Byte = Convert.ToByte(match.Groups(1).Value, 16)
If (buf Is Nothing) Then
If (&H81 <= tmp And tmp <= &H9F) OrElse (&HE0 <= tmp And tmp <= &HFC) Then ' Shift_JISの全角1バイト目の判断
buf = tmp
replacement = String.Empty
Else
replacement = Encoding.Default.GetString(New Byte() {tmp})
End If
Else
replacement = Encoding.Default.GetString(New Byte() {buf, tmp})
buf = Nothing
End If
Return replacement
End Function