VB.netで指定した部分の文字列を置換するには?

解決


VB.netBiginner  2003-11-18 10:38:47  No: 110005  IP: [192.*.*.*]

全角文字が含まれる文字列の何バイトから何バイトまでを
任意の文字列で置換したいのですがどのようにすればいいのかわかりません。
いろいろ試行錯誤やってみたのですがうまくいきませんでした。
どうすれば良いのでしょうか?
どなたかよろしくお願いします。

編集 削除
ねろ  2003-11-18 11:58:48  No: 110006  IP: [192.*.*.*]

文字は全て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番目以降に挿入

編集 削除
VB.netBiginner  2003-11-18 12:44:55  No: 110007  IP: [192.*.*.*]

>ねろさん

親切にありがとうございます。

ただ1つ難点がありまして

Dim a As String = "Abcdアイウエオ愛上尾"
Dim c As String = "あcdアイウエオ愛上尾"

と文字列にどの箇所に全角半角が混在しているか想定できない場合に
指定した場所から置換したい場合はどうすればいいのでしょうか?
上記の例で言いますとどちらの文字列も最終的には
「アイウエオ」を置換して

a = "Abcd○○○○○愛上尾"
c = "あcd○○○○○愛上尾"

にしたいのです。
実際行いたい処理がテキストファイルを1行ずつ読み込んで(固定長)
各行の指定した場所を置換したいのですが・・・

どのように行えばよいのでしょうか?

編集 削除
さわ  2003-11-18 17:13:52  No: 110008  IP: [192.*.*.*]

横レス失礼します
Replace関数とかでは駄目なんでしょうか?

編集 削除
VB.netBiginner  2003-11-18 17:35:58  No: 110009  IP: [192.*.*.*]

Replace関数だと

Abcd○○○○○愛上尾
あcd○○○○○愛上尾

で1行目は5文字目から2行目は4文字目とバラバラになってしまいます。
固定長のレコードをループさせて読み込むところまではできたので
あとは何バイトから何バイト目までをReplaceするようにしたいのですが・・・。
調べたら取得した文字列をバイト配列にして…とか
それをEncodingしてShift-Jisでファイルに書き込まなきゃならんとか
イマイチ私の能力ではどうコーディングしていいか
分からなくて困ってます。

編集 削除
ねろ  2003-11-18 18:08:11  No: 110010  IP: [192.*.*.*]

a = "Abcd○○○○○愛上尾"
c = "あcd○○○○○愛上尾"
aとcは少なくてもVB4.0以降は同じ長さでは有りません。(^^;

>実際行いたい処理がテキストファイルを1行ずつ読み込んで(固定長)
ANSIで書き込まれた一行のデーター長が固定長と言うことでしょうか?
もしそうだとしたら、VB.NETに読み込んだときに文字化けしませんか?

MNが"VB.netBiginner"となっていたのでてっきりVB.NETかと思いましたが
もしかしたらVB6ですか?

編集 削除
VB.netBiginner  2003-11-18 18:17:24  No: 110011  IP: [192.*.*.*]

説明不足で申し訳ないです。VB.netでやってます。
VBの知識はありません…
テキストファイル(Shift-JIS)を読み込んで(StreamReader使用)
それをstring型に代入まで行いました。
テキストファイルの中身は上記のように

Abcd○○○○○愛上尾
あcd○○○○○愛上尾
あい○○○○○愛上尾

のように複数レコードあって"○”の部分を他の全角文字に
置換するようにしたいのですができなくて悩んでます。

編集 削除
さわ  2003-11-18 18:35:32  No: 110012  IP: [192.*.*.*]

.netではLenBは使えないのですか?

編集 削除
ねろ  2003-11-18 20:17:13  No: 110013  IP: [192.*.*.*]

細かいところまで検討はしてないけれど概念的に
    '読み込み
    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!

編集 削除
VB.netBiginner  2003-11-18 22:21:34  No: 110014  IP: [192.*.*.*]

わざわざサンプルまで載せて頂いて本当にありがたいです。
これを元に【このままでいいかもしれませんが。(^^;】
また明日もう一度やってみます。
AscとかChr関数は今の時点では???なので
ちゃんと調べて自分のものにしようと思います。
どうもありがとうございました。

編集 削除
ねろ  2003-11-18 22:25:32  No: 110015  IP: [192.*.*.*]

↑のコード、これでも一応エラーにはならないけど
s()は配列の必要は無いので、疑問に思った人にはごめんなさい。
書き換えてる途中で送っちゃって...(^^;

編集 削除
VB.netBiginner  2003-11-19 11:07:39  No: 110016  IP: [192.*.*.*]

申し訳ないです、追加質問です。
上記のサンプルを元に実装してみたのですが

ss = ss.Remove(4 * 2, 5 * 2)

の箇所で
"インデックスおよびカウントは文字列内の場所を
参照しなければなりません。"
とエラーになったので調べてたらどうやら文字列内に
"abcde全角fghij全角klmn"
とあった場合、最初の全角文字は置換できますが2番目の全角文字は
置換できずに上記のエラーが発生するみたいです。
うまく手直ししたいのですがどうすればいいでしょうか?

編集 削除
VB.netBiginner  2003-11-19 11:36:30  No: 110017  IP: [192.*.*.*]

本当にすいません。
ちゃんと調べたら私の勘違いでした…
正確に置換されました。
失礼しました...(^^;

編集 削除