CSVの読み込みが上手く行かない

このQ&Aのポイント
  • Visual Basic 2010 Expressを使用してCSVファイルを読み込む際に問題が発生しています。
  • ファイルの内容が正しく表示されず、テキストボックスに表示される内容が一部重複しています。
  • 正しくファイルの内容を読み込んでテキストボックスに表示させる方法について教えてください。
回答を見る
  • ベストアンサー

csvの読み込みがうまく行かない

こんにちは。質問させていただきます。 (Visual Basic 2010 エクスプレス) 下記のように書いたのですが、ファイルの内容どおりに読み込んでくれません。 ファイルの中身は さささ,0,ししししししし すすす,0,せせせせせせ そそそ,0,たたたたた となっているのですが、最初の一行を読み込み、しかも最初の一行を繰り返し2段目3段目の テキストボックスに表示させてしまいます。 具体的には さささ ししししししし さささ ししししししし さささ ししししししし です。 本来は さささ ししししししし すすす せせせせせせ そそそ たたたたた と表示させたいのです。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Using reader As New System.IO.StreamReader("C:\csvtest\test.csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items() As String 'CSVの各項目を表す配列 Dim Line As String = reader.ReadLine 'CSVの一行 Do Until IsNothing(Line) Items = Line.Split(",") '一行を, (カンマ)で区切って項目ごとに分解 With reader TextBox1.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox2.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 TextBox3.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox4.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 TextBox5.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox6.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 .Close() End With Loop End Using End Sub 問題点がわかる方、よろしくおねがいします!

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

最初の一行を読んだときしかsplitしてないのが原因でしょう。 csv読むにはTextFieldParser使った方がだいぶラクですけどね。 http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.fileio.textfieldparser.aspx

momondesu
質問者

お礼

おかげさまで出来ました! 具体的には With reader Items = Line.Split(",") TextBox1.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox2.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 Items = Line.Split(",") TextBox3.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox4.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 Items = Line.Split(",") TextBox5.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox6.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 .Close() End With にしました。 教えていただいた >csv読むにはTextFieldParser の件につきましては、とりあえずメモをしておいて 後々の課題にさせていただきます。 (今はプログラムが正常に動くのを優先させたいので) 本当にありがとうございました。

関連するQ&A

  • CSVの読み込みについて

    いつもお世話になります。 TextBox1に品物のコードを入れて、Label1に価格を表示するという簡単そうなものです。 品物のコードはCSVファイルのItem(1)から取得します。ところが存在しないコードを入力すると、 追加情報 : インデックスが配列の境界外です というエラーが出ます。下記ソースに何を追加すればよろしいのでしょうか?ご教授下さい。よろしくお願い致します。 Dim Reader As New IO.StreamReader("C:\XXX.csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items() As String Dim Line As String = Reader.ReadLine       Dim Code As String 'コード Dim kakaku As String '価格 Do Until IsNothing(Line) Items = Line.Split(",") Code = Items(1) If HinCode = TextBox1.Text Then kakaku = Items(2) Label1.Text = kakaku Exit Sub End If Line = Reader.ReadLine Loop Reader.Close()

  • VB2008EEのチェックボックスにて、

    VB2008EEのチェックボックスにて、 9個のチェックボックスをオン/オフで9個のテキストボックスに文字を表示/非表示させる場合、 一旦チェックをオンにすると値が入ったままになって、オフにしても表示されてしまうため チェックがオフのものはボタン1クリックで空にしています。 1~9まであるのですが、1~4までは機能しているのですが、5~9が機能しません。 1~4にチェックが入っていると下記は実行されません。 5~9にチェックが入っていても下記が実行されてしまいます。      (実際は各番号)         ↓ If CheckBox5.CheckState = CheckState.Unchecked Then layp5 = "" End If なぜ4までと5からで動作が変わるのでしょうか? -------------------------------------------------------------- Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged layp1 = "1" End Sub '実際は2~8も記述あり Private Sub CheckBox9_CheckedChanged(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged layp9 = "9" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal eAsSystem.EventArgs) Handles Button1.Click If CheckBox1.CheckState = CheckState.Unchecked Then layp1 = "" End If '実際は2~8も記述あり If CheckBox9.CheckState = CheckState.Unchecked Then layp9 = "" End If If (layp1 = "1") Then TextBox1.Text = "aaaaa" End If If (layp2 = "2") Then TextBox2.Text = "bbbbb" End If If (layp3 = "3") Then TextBox3.Text = "ccccc" End If If (layp4 = "4") Then TextBox4.Text = "ddddd" End If If (layp5 = "5") Then TextBox5.Text = "eeeee" End If If (layp6 = "6") Then TextBox6.Text = "fffff" End If If (layp7 = "7") Then TextBox7.Text = "ggggg" End If If (layp8 = "8") Then TextBox8.Text = "hhhhh" End If If (laypca = "9") Then TextBox9.Text = "iiiii" End If End Sub

  • VBを2008を用いてCSVを取り込む ””で区切られていない数値混入

    VBを2008を用いてCSVを取り込む ””で区切られていない数値混入 文字列に,が含まれている場合がある。 題名どおりなのですが、以下のようなCSVファイルをVB2008で取り込もうと考えています。 "AAAAA",BBBBB,CCCCC,"DDDD,DDD","EEEEE","FFFFF" (同じアルファベットが本来同じ項目のデータ、BとCは0-9の数字のみ入ります またBCには常に””が含まれません。 Dは文字列なのですが、まれに「,」が含まれます) 下のものが現在使用しているソースですがsplitで「,」を指定しているので 当然Dが2つのデータとして認識されています。 BやCが””で囲まれていれば「”,”」で区切ればすむのですが一部が””なしなので どうやろうか迷っています。 実現したいこととしては ""なしの時は必ず、コンマまでが1つのデータ、 ""があれば""で区切られたデータが1つのデータとできればいいんですが。。。 以下ソースです。 ちなみにASPXファイルです。 (replaceDoubleQuotesというのは”を削除するための関数で無視していただいて結構です。 また以下のソースでは取り込み自体はせずにタイトル行がはいっているCSVファイルを弾く作業をしているのですが CSVからデータを取り出す作業は同じなので短いソースを使用させてもらっています) Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim Reader2 As New IO.StreamReader("C:\UploadedFiles\Uriage.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items2() As String 'CSVの各項目を表す配列 Dim Line2 As String = Reader2.ReadLine 'CSVの一行 Items2 = Line2.Split(",") Dim num_hantei As String = "^[0-9]+$" If Not (Regex.IsMatch(replaceDoubleQuotes(Items2(3)), num_hantei)) Then Dim objFSO As Object objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile("C:\UploadedFiles\Uriage.txt", True) objFSO = Nothing Label1.Text = "取り込みエラー。タイトル行がはいっている可能性があります。" Exit Sub End If Reader2.Close() End Sub Function replaceDoubleQuotes(ByVal apdata As Object) As String '文字列に変換する Dim tmp As String = String.Format("{0}", apdata) '1つのダブルクォーテーションを0個に置換する つまり消去する replaceDoubleQuotes = tmp.Replace("""", "") End Function

  • CheckBoxがTrueの場合に表示をさせるには?

    VB2008を使用しています。 3つのCheckBox1~3とそれに対応した3つのTextBox1~3を準備し、 Buttonを押すとCheckBoxがTrueのものだけをRichTextBox1に表示 させたくて下記のプログラムを作成しました。 しかしCheckBox1とCheckBox3については上手く作動するのですが CheckBox2について不具合が発生します。 (不具合) CheckBox1=TrueでButtonを押すとRichTextBox1にTextBox1を表示。 その後、CheckBox3=TrueでButtonを押すとRichTextBox1にTextBox1. TextBox3と表示。 ここまでは良いのですが、 CheckBox2=TrueでButtonを押すとRichTextBox1にTextBox2を表示。 その後、CheckBox3=TrueでButtonを押すとRichTextBox1にTextBox2. TextBox2.TextBox3と表示されてしまいTextBox2の内容が重複して しまいまいます。 何か良い解決策がありましたら教えて下さい。 よろしくお願いいたします。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click     If Me.CheckBox1.Checked = True Then RichTextBox1.Text = TextBox1.Text End If     If Me.CheckBox2.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "."     End If RichTextBox1.Text = RichTextBox1.Text & TextBox2.Text     End If If Me.CheckBox3.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "." End If RichTextBox1.Text = RichTextBox1.Text & TextBox3.Text End If End Sub

  • CSVの読み込み処理について

    こんばんわです。 エクセルのVBAをつかってCSV形式のファイルデーターを読み込みように某サイトを参考に作成しました。 確かに読み込む事が出来たのですが、数値も文字列扱いになってしまいます。 数値処理する方法があるのでしょうか? Sub CSV_Read2() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim textline, csvline() As String Dim Rowcnt, ColumNum As Integer Dim ch1 As Long FileType = "CSV ファイル (*.csv),*.csv" Prompt = "CSV File を選択してください" '操作したいファイルのパスを取得します FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 '1行読み込みます Line Input #ch1, textline 'ダブルクォーテーションを削除します 'カンマ+ダブルクォーテーションで区切られている CSV ファイルなどは '適時追加してください textline = Replace(textline, """", "") 'カンマで分離します csvline() = Split(textline, ",") '配列渡しでセルに代入 Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function Function GetItemNum(FileNamePath) As Integer Dim ch1 As Long Dim textline As String '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 Line Input #ch1, textline '1行だけ読み込みます。 Close #ch1 GetItemNum = 1 '1行中のカンマの数を数えます Do GetItemNum = GetItemNum + 1 textline = Mid(textline, InStr(textline, ",") + 1) Loop Until InStr(textline, ",") = 0 End Function

  • RichTextBoxに代入されたTextBoxの数を表示

    VB2008を使用しています。現在、10個のTextBoxとそれに対応するCheckBoxを作成し、チェックの入ったTextBox内の文字をRichTextBoxに代入するプログラムを作成しています。そこでRichTextBoxに代入されたTextBoxの数を別のTextBoxに表示させたいのですが何か良い方法はありますでしょうか?現在、下記のようにコードを組んであります。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click RichTextBox1.Clear() If Me.CheckBox1.Checked = True Then RichTextBox1.Text = TextBox1.Text If Me.CheckBox2.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox2.Text ・ ・ ・ If Me.CheckBox10.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox10.Text End If

  • CSVデータの読み込みについて

    大変お世話になっております。 CSVデータを読み込みたいのですが、 以下のようになってしまいます。 ----test.csv----- 1,a2,a3 2,a2,a3 3,a2,a3 4,a2,a3 5,a2,a3 6,a2,a3 7,a2,a3 8,a2,a3 9,a2,a3 10,a2,a3 ----------------- //FileReaderでもFileでも結果は同じ // FileReader t_in = new FileReader("test.csv"); File t_in = new File("test.csv"); BufferedReader in = new BufferedReader(new FileReader(t_in)); while (in.ready()) { String line = in.readLine(); System.out.println("lineは " + (line = in.readLine()) + " です。"); } ---------表示結果--------- lineは 2,a2,a3 です。 lineは 4,a2,a3 です。 lineは 6,a2,a3 です。 lineは 8,a2,a3 です。 lineは 10,a2,a3 です。 ------------------------- 1,3,5,7,9はなぜ読み込んでくれないのでしょうか? ご存知の方、いらっしゃったら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ボタンをクリックしても空白をリストに追加しないようにしたい

    初心者ですのでよろしくお願いいたします。 以下のようなコードでボタンを押すとテキストボックスに入力してあるテキストをリストに登録したいのですが、空白の場合は追加したくありません。どのように書けばいいでしょうか? よろしくお願いいたします。 (ちなみにLabel3にはリストに登録された数が出ます) Public Class Form1 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ListBox1.Items.Add(TextBox1.Text) TextBox1.Clear() Label3.Text = ListBox1.Items.Count End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ListBox1.Items.Remove(ListBox1.SelectedItem) Label3.Text = ListBox1.Items.Count End Sub End Class

  • csvを新ファイルに8番目で大きい順に並び替え

    VB2010です。 前回、質問させて頂いた続きです。 前回は質問の仕方が失敗で大変皆様にご迷惑をおかけしました・・・・・ 本当に申し訳なく思っています・・・ もうだんだん迷路に入ってしまったので、コードをそのまま記載しました。 Itm(7)を基準に数字の大きい順に並び替えしたいのです。 CSVは全部で19列あります。 ファイルによって違いますが、行数はだいたい100行ぐらいです 無理やりしたのコードを書いたのですが、あと一歩でやはりきれいに並び替えができません・・・ 大変皆様にお手数ですがお助け下さい・・・・ プロの皆様にはかなり幼稚なコードで大変失礼します。 いろいろと試してみたのですが、これぐらいしか自分の力量では思いつかなくて・・・・ 沢山失敗を繰り返したので変なコードも入っているかもですが・・・・・ Dim z As Integer = 0 Dim ReaderA As New IO.StreamReader(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & ".csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim LineA As String = ReaderA.ReadLine Dim Itm() As String Dim s As Integer = 0 Do Until IsNothing(LineA) Itm = LineA.Split(",") If z = 0 Then Dim Writer As New IO.StreamWriter(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv", False, System.Text.Encoding.GetEncoding("Shift-JIS")) Writer.WriteLine(LineA) Writer.Close() Else Dim ReaderB As New IO.StreamReader(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Writer As New IO.StreamWriter(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New2.csv", False, System.Text.Encoding.GetEncoding("Shift-JIS")) Dim LineB As String = ReaderB.ReadLine Dim Stm() As String Dim u As Integer = 0 Do Until IsNothing(LineB) Stm = LineB.Split(",") If Integer.Parse(Itm(7)) > Integer.Parse(Stm(7)) Then If u = 0 Then Writer.WriteLine(LineA) u += 1 End If End If Writer.WriteLine(LineB) If Integer.Parse(Itm(7)) <= Integer.Parse(Stm(7)) Then If u = 0 Then Writer.WriteLine(LineA) u += 1 End If End If s += 1 LineB = ReaderB.ReadLine Loop Writer.Close() ReaderB.Close() IO.File.Delete(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv") Microsoft.VisualBasic.FileSystem.Rename(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New2.csv", SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv") End If z += 1 LineA = ReaderA.ReadLine Loop ReaderA.Close()

  • vb2008より、ファイル読み込み書き込みの際に発生する文字化けについて

     初めて投稿させて頂くkuro_sanと申します。どうぞよろしくお願いします。  現在visual basic 2008を用いてプログラムを作成しているのですが、データの読み込み、書き込みを行う箇所で問題が発生したために、行き詰まっております。  コードを以下に示させて頂きます。 [書き込み処理関数] Private Sub WriteLog(ByVal FileName As String) 'File Open Dim Writer As New IO.StreamWriter(FileName, True) '書き込み処理 For i As Integer = 0 To i Writer.WriteLine(Table(0, i) & "," & Table(1, i) & "," & Table(2, i)) Next Writer.Close() End Sub [読み込み処理関数] Private Sub Readlog(ByVal FileName As String) Dim Reader As New IO.StreamReader(FileName, System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items() As String = New String() {} Dim Line As String = Reader.ReadLine 'CSVの一行 'データの読み込み i = 0 Do Until IsNothing(Line) Items = Line.Split(",") i += 1 Table(0, i) = Items(0).ToString Table(1, i) = Items(1).ToString Table(2, i) = Val(Items(2)) Line = Reader.ReadLine Loop End Sub です。  書き込みはtext形式の物に行っています。Table配列には(0,i),(1,i)にはString型の文字が、(2,i)には数字が入力されています。 入力、出力は行うことが出来るのですが、(0,i),(1,i)にひらがな、カタカナ、漢字などの文字が使われていると、読み込みを行った際に文字化けして格納されてしまいます。 (例:くろ,kuro,1 → 縺上m,kuro,1)  出力されたtextの中では文字化けが起こっていませんが、形式を直接csvに変換したり、読み込みを行った際に文字化けが発生している事から、書き込み時に問題があるのではないか、と思い調べているのですが、原因を判明できていません。 文字化けを発生させずに読み込み、書き込み処理を行う方法をご存知である方がいらっしゃればご教授頂けますと幸いです。