DOBON.NET DOBON.NETプログラミング掲示板過去ログ

テキストファイルを読み込み、TAB区切りでtxtファイルに書き出す方法について

環境/言語:[Windows XP]
分類:[.NET]

2009/05/29(Fri) 00:00:09 編集(投稿者)

こんにちは。
初心者で申し訳ないです。

TAB区切りで区切られたテキストファイルを読み込み、決められた順番に別のファイルにTAB区切りで書き出すプログラムに挑戦してますが、うまく行きません。
どうかご指南の程をよろしくお願いします。

<読み込むファイル>
ファイル名:ABC.txt
ABC.txtの中身は以下のようになっています。

no 0002
name bbb
date yyy/mm/dd

no 0001
name aaa
date yyy/mm/dd
.

※ドットが切れ目を表してます。
※空白はTABで区切られています。

これを読み込み、mess_w.txtとして以下のように出力したいのです。

0001<TAB>aaa<TAB>yyy/mm/dd
0002<TAB>bbb<TAB>yyy/mm/dd

※<TAB>部分はTAB区切り部分を表します。

ところが、私が作ったプログラムを実行すると以下のように出力されてしまい困っています。

<TAB>0001<TAB><TAB><TAB>aaa<TAB><TAB>yyy/mm/dd
<TAB>0002<TAB><TAB>bbb<TAB><TAB>yyy/mm/dd

そこでこれを上記の正しい形に修正したいのですが、試行錯誤しても中々直りません。多分根本的な部分で間違えていると思いますが・・・具体的な修正項目としては以下のようになります。

・どうしても先頭にTABが入ってしまうのを無くしたい
・1行目は001の後にTABが3つある事と、aaaとyyy/mm/dd の間にはTABが2つ入っているのを1つにしたい
・001とaaaの間に2つTABが入ってしまうのを1つにしたい。
・2行目は002とbbbの間にTABが2つ入ってしまうのを1つにしたい。
・bbbとyyy/mm/ddの間にTABが2つ入ってしまうのを1つにしたい。

以下に私が書いたコードを示します。
どうにも初心者ですみませんが、どうかご教授下さい。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim No(500) As String
Dim No_fix(500) As String
Dim namae(500) As String
Dim namae_fix(500) As String
Dim dete(500) As String
Dim dete_fix(500) As String
Dim initial As String '項目名
Dim kijino As String
Dim namae_data As String
Dim dete_data As String
Dim txt_put As String
Dim txtline As String
Dim tab As Char
Dim i As Integer

Dim Encode As System.Text.Encoding
Encode = System.Text.Encoding.GetEncoding("Shift-JIS")
Dim abc_txt As New IO.StreamReader("C:\massage.txt", Encode)
Dim mess_W As New IO.StreamWriter("C:\mess_w.txt", False, Encode)

tab = vbTab

Do Until i = 500

'項目名の取得
txtline = abc_txt.ReadLine()
initial = Strings.Left(txtline, 2)

'NOの値取得
If initial = "no" Then
No(i) = Strings.Mid(txtline, 3, 10)
No_fix(i) = Trim(No(i))
kijino = No_fix(i)
End If

'nameの値取得
If initial = "na" Then
namae(i) = Strings.Mid(txtline, 5, 50)
namae_fix(i) = Trim(namae(i))
namae_data = namae_fix(i)
End If

'dateの値取得とファイル書き出し
If initial = "da" Then

dete(i) = Strings.Mid(txtline, 5, 50)
dete_fix(i) = Trim(dete(i))
dete_data = dete_fix(i)

txt_put = kijino + tab + namae_data + tab + dete_data

mess_W.Write(Trim(txt_put))
mess_W.Write(vbNewLine)

End If
i = i + 1
Loop

abc_txt.Close()
mess_W.Close()
MsgBox("処理完了")
End Sub

以上、よろしくお願いします。
こんにちは。

ぱっと見ですが、ABC.txtの内容が本当にご提示いただけたのもであれば、ご質問されたような出力にはならないように思えます。

デバッグはされたでしょうか?例えば、ブレークポイントを設置して一行ずつ実行して、変数の値がどのように変化するか確認されましたか?

なお、単にデバッグを依頼するようなご質問内容ですとこの掲示板のルール違反になりますので、ご注意ください。

書き込みのルールについて
http://dobon.net/vb/bbs/index.html
こんにちは。

>No(i) = Strings.Mid(txtline, 3, 10)

3文字目から取り出しているのでTAB文字が入ると思いますが。

>no 0002

空白はTAB文字なんですよね。
2009/05/29(Fri) 21:55:56 編集(投稿者)

■No24646に返信(ヴァンさんの記事)
> こんにちは。
>
> >No(i) = Strings.Mid(txtline, 3, 10)
>
> 3文字目から取り出しているのでTAB文字が入ると思いますが。
>
> >no 0002
>
> 空白はTAB文字なんですよね。
>

ああっ!
確かにそうですね。
自分のばかさ加減にうんざりです。
修正したら確かにちゃんとなりました。
ありがとうこざいました!!

管理人様もつまらない投稿をしてしまい申し訳ありません。
解決済み!
「※空白はTABで区切られています。」というのを見落としていました。すみません。Trimではなく、String.Trimであれば、タブ文字も削除できますね。
解決済み!
■No24650に返信(管理人さんの記事)
> 「※空白はTABで区切られています。」というのを見落としていました。すみません。Trimではなく、String.Trimであれば、タブ文字も削除できますね。

ありがとうございました。
ツリー式掲示板が破損して現在復旧中なのですが、文書数が膨大で手動では無理と判断し、見よう見まねでVBでやろうとしてます。

まだ解決できない問題が山積みですが、これで全ての記事を抽出できたので、あとは階層構造を調べて並び替えるだけなんですが、小生の頭ではかなり厳しいものがあります。また質問させて頂くかもしれませんが、よろしくお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板