全角文字が含まれる文字列の何バイトから何バイトまでを
任意の文字列で置換したいのですがどのようにすればいいのかわかりません。
いろいろ試行錯誤やってみたのですがうまくいきませんでした。
どうすれば良いのでしょうか?
どなたかよろしくお願いします。
文字は全てUnicode 2バイトで管理されます。
全角半角は関係有りません。
従って何バイトから何バイトと言うことは
(何文字)*2から(何文字)*2までと同意語となります。
文字列の操作は.NET frameworkの場合 Stringクラスのメソド
を使用します。
置換は削除してから同じ場所に挿入します。
Dim a As String = "Abcdアイウエオ愛上尾"
Dim b As String = "あいうえお"
a = a.Remove(4, 5) '4番目から5個を削除
a = a.Insert(4, b) '4番目以降に挿入
>ねろさん
親切にありがとうございます。
ただ1つ難点がありまして
Dim a As String = "Abcdアイウエオ愛上尾"
Dim c As String = "あcdアイウエオ愛上尾"
と文字列にどの箇所に全角半角が混在しているか想定できない場合に
指定した場所から置換したい場合はどうすればいいのでしょうか?
上記の例で言いますとどちらの文字列も最終的には
「アイウエオ」を置換して
a = "Abcd○○○○○愛上尾"
c = "あcd○○○○○愛上尾"
にしたいのです。
実際行いたい処理がテキストファイルを1行ずつ読み込んで(固定長)
各行の指定した場所を置換したいのですが・・・
どのように行えばよいのでしょうか?
横レス失礼します
Replace関数とかでは駄目なんでしょうか?
Replace関数だと
Abcd○○○○○愛上尾
あcd○○○○○愛上尾
で1行目は5文字目から2行目は4文字目とバラバラになってしまいます。
固定長のレコードをループさせて読み込むところまではできたので
あとは何バイトから何バイト目までをReplaceするようにしたいのですが・・・。
調べたら取得した文字列をバイト配列にして…とか
それをEncodingしてShift-Jisでファイルに書き込まなきゃならんとか
イマイチ私の能力ではどうコーディングしていいか
分からなくて困ってます。
a = "Abcd○○○○○愛上尾"
c = "あcd○○○○○愛上尾"
aとcは少なくてもVB4.0以降は同じ長さでは有りません。(^^;
>実際行いたい処理がテキストファイルを1行ずつ読み込んで(固定長)
ANSIで書き込まれた一行のデーター長が固定長と言うことでしょうか?
もしそうだとしたら、VB.NETに読み込んだときに文字化けしませんか?
MNが"VB.netBiginner"となっていたのでてっきりVB.NETかと思いましたが
もしかしたらVB6ですか?
説明不足で申し訳ないです。VB.netでやってます。
VBの知識はありません…
テキストファイル(Shift-JIS)を読み込んで(StreamReader使用)
それをstring型に代入まで行いました。
テキストファイルの中身は上記のように
Abcd○○○○○愛上尾
あcd○○○○○愛上尾
あい○○○○○愛上尾
のように複数レコードあって"○”の部分を他の全角文字に
置換するようにしたいのですができなくて悩んでます。
.netではLenBは使えないのですか?
細かいところまで検討はしてないけれど概念的に
'読み込み
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim sr As System.IO.StreamReader
OpenFileDialog1.ShowDialog()
'shift-jisを変換して読み込む
sr = New System.IO.StreamReader(OpenFileDialog1.FileName, _
System.Text.Encoding.GetEncoding("shift-jis"))
TextBox2.Text = sr.ReadToEnd()
sr.Close()
End Sub
'書き込み
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click
Dim sr As System.IO.StreamWriter
sr = New System.IO.StreamWriter("text2.txt", _
True, System.Text.Encoding.Default)
sr.Write(TextBox2.Text)
sr.Close()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click
Dim s(Len(TextBox2.Text)) As String
Dim ss As String
Dim n As Integer
For n = 0 To Len(TextBox2.Text) - 1
s(n) = TextBox2.Text.Substring(n, 1)
If Asc(s(n)) < 0 Then s(n) += Chr(1) '全角だったらChr(1)を追加
ss += s(n)
Next n
'文字の入れ替え
Dim b As String = "あいうえお" '入れ替える文字
ss = ss.Remove(4 * 2, 5 * 2)
ss = ss.Insert(4 * 2, b)
ss = ss.Replace(Chr(1), "") '追加文字の削除
TextBox2.Text = ss
End Sub
要するにTextファイルには絶対に現れないChr(1)を全角文字の後ろに挿入して
長さをあわせる、後は文字を入れ替えて、Chr(1)を消す。
大体こんな感じで。後はGood luck!
わざわざサンプルまで載せて頂いて本当にありがたいです。
これを元に【このままでいいかもしれませんが。(^^;】
また明日もう一度やってみます。
AscとかChr関数は今の時点では???なので
ちゃんと調べて自分のものにしようと思います。
どうもありがとうございました。
↑のコード、これでも一応エラーにはならないけど
s()は配列の必要は無いので、疑問に思った人にはごめんなさい。
書き換えてる途中で送っちゃって...(^^;
申し訳ないです、追加質問です。
上記のサンプルを元に実装してみたのですが
ss = ss.Remove(4 * 2, 5 * 2)
の箇所で
"インデックスおよびカウントは文字列内の場所を
参照しなければなりません。"
とエラーになったので調べてたらどうやら文字列内に
"abcde全角fghij全角klmn"
とあった場合、最初の全角文字は置換できますが2番目の全角文字は
置換できずに上記のエラーが発生するみたいです。
うまく手直ししたいのですがどうすればいいでしょうか?
本当にすいません。
ちゃんと調べたら私の勘違いでした…
正確に置換されました。
失礼しました...(^^;
ツイート | ![]() |