質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.24%

textファイルを読み込み、置換後にcsvにする方法について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,012

hainan

score 31

いつも勉強させていただいております。
仕事でVB.NETの勉強をすることになり、参考書などで勉強している初心者です。

業務で気になった処理を、(勉強の意味が強いのですが)プログラム化できないかと思い
VBに関するサイトを見てまわったのですが、理解ができず
相談させていただきました。

※最終的にもっと違う形で作りたいとは思います

前提・実現したいこと

不変型のテキストファイルを読み込み、いらない部分を削除(""を省くなど)したのち
csvファイルへ変換・保存したいと考えています。

1行ごとに取り出し、変換するところまでは理解ができたのですが
csvへ書き込む際の方法がわからず、質問させていただきました。

問題点

・textファイルをcsvファイルに変換する際に、配列へ変換したのですが
この作業は不要かどうかがわかっておりません。
`sbArray = Split(sb, ",") の部分です)

・1行ずつ変換して書き込みをする処理なので、

 「StreamWriter」で記載をしても処理が可能なのかわかりませんでした

(テストしてみたのですが、上手くできませんでした)

該当のソースコード

ファイルは以下のような構成で、テキストファイルに格納されています。 行は100行ほどあり、全てが埋まっているのではなく、空白の項目もあります。

A,"B","C","D","E","F","G","H","I","J","K","M"  
Public Class FailConversion  


'ファイル選択ボタンを押したとき  
Private Sub ChoiceBtn_Click(sender As Object, e As EventArgs) Handles ChoiceBtn.Click  

'ファイルを開くダイアログを指定  
Dim ofd As New OpenFileDialog  

'ファイルの種類をtxtのみに指定  
ofd.Filter = "テキスト文書(*.txt)|*.txt|すべてのファイル(*.*)|*.*"  

'タイトルを設定  
ofd.Title = "開くファイルを選択してください"  

'OKを押した後にファイル名を表示  
If ofd.ShowDialog() = DialogResult.OK Then  
FileName.Text = ofd.FileName  
End If  
End Sub  

'ファイル変換ボタンを押したとき  
Private Sub ExecutionBtn_Click(sender As Object, e As EventArgs) Handles ExecutionBtn.Click  
'ファイルのパス  
Dim fp As String = FileName.Text  
'ファイルを読み込みで開く  
Dim sr As New System.IO.StreamReader(fp)  

'一時ファイルを作成する  
Dim tp As String = System.IO.Path.GetTempFileName()  
'一時ファイル書き込みで開く  
Dim sw As New System.IO.StreamWriter(tp)  


'データ入力用の配列を設定  
Dim sbArray As String  

'読み込みできる文字がなくなるまで繰り返す  
While (sr.Peek() >= 0)  

'1行を読み込み、stringBuilderを作成する  
Dim sb As New String(sr.ReadLine)  

'区切り用の「""」を省き、空白へ変換  
sb.Replace("""", "")  

'データを分割する(sbArray配列へ変換)  
sbArray = Split(sb, ",")  

'データを一時的に配列へ保存  
sw.WriteLine(sbArray)  


End While  

End Sub  
End Class  

補足情報(言語/FW/ツール等のバージョンなど)

PC:windows10 64bit
VB:Visual Studio2017

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/11/13 12:09

    dobon.net の記事 http://dobon.net/vb/dotnet/file/readcsvfile.html の最初にある「CSV形式とは?」のセクションだけでいいので目を通してみてください。そのうえで、あなたの言う「いらない部分を削除(""を省くなど)」とか、Split(sb, ",") のように単純にカンマで分けて良いものかを考え、上記の質問を見直す必要があれば質問を書き直してください。

    キャンセル

  • hainan

    2017/11/13 19:14

    ご指摘ありがとうございます。まだVBとCSVを理解しておらず、申し訳ないです。いただいた記事を確認し、変更してみます。お忙しいところありがとうございます!

    キャンセル

回答 1

checkベストアンサー

0

この作業は不要かどうかがわかっておりません。

この処理は

A,"B","C","D","E","F","G","H","I","J","K","M"  


を、A,B,CMという複数の要素に分割しているものです。
例となりますが、配列の要素番号を弄れば、必ず、BAを入れ替えるという処理が可能になります。
sbArray(1) & sbArray(0)という感じで…

こういったことが不要であれば配列要素にする必要はありませんが、CSVを何らかの形に加工するのであれば
必要な処理だと推測されます。

ちなみに、提示されたソースですとsbArray = Split(sb, ",")はエラーとなります。
これは、受け取るsbArrayが文字列の配列ではなく単なる文字列として定義されている為で、対処するには下記の修正が必要となるでしょう。

Dim sbArray As String()'()をつける!

それと、実行すれば分かりますが、これではファイルにSystem.String[]が書き出されるだけです。

'データを一時的に配列へ保存  
            sw.WriteLine(sbArray) '???


CSVをCSVに変換しているのあまり、意味はありませんがサンプルソースを添付してみます。
ご参考までにご覧ください。

    'ファイル変換ボタンを押したとき  
    Private Sub ExecutionBtn_Click(sender As Object, e As EventArgs) Handles ExecutionBtn.Click
        'ファイルのパス  
        Dim fp As String = FileName.Text
        'ファイルを読み込みで開く  
        Dim sr As New System.IO.StreamReader(fp)

        '一時ファイルを作成する  
        Dim tp As String = System.IO.Path.GetTempFileName()
        '一時ファイル書き込みで開く  
        Dim sw As New System.IO.StreamWriter(tp)


        'データ入力用の配列を設定  
        'Dim sbArray As String
        Dim sbArray As String()

        Dim test = sr.Peek()

        '読み込みできる文字がなくなるまで繰り返す  
        While (sr.Peek() > -1)

            '1行を読み込み、stringBuilderを作成する  
            Dim sb As New String(sr.ReadLine)

            '区切り用の「""」を省き、空白へ変換  
            Dim writeString = sb.Replace("""", "") 'リプレース後の文字列の格納先が無いとまずいので修正。

            'データを分割する(sbArray配列へ変換)  
            sbArray = Split(writeString, ",")

            'データを一時的に配列へ保存  
            'sw.WriteLine(sbArray) '???
            '例えば…(CSVにして書き出す)意味ないですが…
            For i = 0 To sbArray.Count - 1
                'フィールドの取得
                Dim field As String = sbArray(i).ToString()
                'フィールドを書き込む
                sw.Write(field)
                'カンマを書き込む
                If sbArray.Count - 1 > i Then
                    sw.Write(","c)
                End If
            Next
            '改行する
            sw.Write(vbCrLf)

        End While
        sw.Close() 'ファイル閉じましょう!

    End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/13 19:22 編集

    確認が遅くなってしまい、申し訳ありません。
    また、ご回答ありがとうございました!

    質問内容にコメントいただいた、SurferOnWww さんにもご指摘いただいたのですが
    text ファイルと csvファイルは同一(互換性?)があるということを
    初めて知りました・・・。

    元々、text ファイルはcsvを変換していたものなので、
    (質問に記載しておりませんが、別の加工はしたいので)
    いただいた内容をもとに、csvファイルから加工→別のファイルとして保存するような
    コードが作れるよう、もっと勉強していきたいと思います。

    お忙しいところありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.24%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる