• 締切済み

CSVファイルの読み込みと表示(VB.NET)

前回の質問では大変お世話になりました。 引き続き、VB.NETの勉強をしております。 特定のCSVファイルを読み込んで、その内容をラベルに表示させるプログラムを作成しています。 そのCSVファイルには、以下の情報が書かれています。 1:都道府県(北海道、岩手県、神奈川県、兵庫県など) 2:各都道府県の人口 3:各都道府県の面積 3つの情報は、すべてカンマで区切られています。 各都道府県ですので、47行にわたって情報が書かれています。 まず、ボタン1を押したときに、CSVファイルを読み込み 日本の総人口と総面積をラベルに表示させます。 次に、日本を10のエリアに分け(関東地方、近畿地方など) それぞれにボタンを配置します。 対応する地域のボタンを押すと、新しいウィンドウが開き 地域名・その地域の総人口・総面積が表示されます。 CSVファイルを読み込むという点で調べてみたのですが 複数の行にまたがっている情報をひとつにまとめて表示させる というのがよくわかりません。 CSVファイルの読み込み自体は、StreamReaderというものを利用する ということは調べたのですが、まとめて表示させるということがわかりません。 この問題がおわかりになるかたがいましたら、教えていただけますか。 よろしくお願いします。

みんなの回答

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.3

> これを書いてみると、「Lengthはdataのメンバではありません」というエラーが出ます。 流れだけを説明するために書いたもので、動作確認してませんのでそのまま貼っても動かないと思います。 # できれば、あなたがお書きになったもので動作がうまくいかないという箇所を質問してくださると助かります。 次のコードは VB.NET 2003 で動作確認してあります。 取り敢えず、参考にしてみてください。 コードの一番先頭に Imports System.IO Imports System.Text を追記 Call SumAll("c:\data.csv") の引数のファイル名をあなたがお使いのファイル名をフルパスで記述して 置き換えれば動作すると思います。 ボタンを押した時にメッセージボックスに合計がでますので、ラベルに表示する部分やその他の部分は ご自身で考えてください。(この場合もどこまでご自身でなさったかを示して頂けるとよろしいです) 意味がわからないことがありましたら、どの部分かを引用なさった上でお願いいたします。 ---------------------------------------- REM ボタンを押した時 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  Call SumAll("c:\data.csv") End Sub ---------------------------------------- REM 全国 Sub SumAll(ByVal szFileName As String)  REM 合計表示  Dim lines()() As String = ReadCSV(szFileName)  Dim index As Integer = 0  Dim sum_all_people As Double  Dim sum_all_area As Double  For index = 0 To lines.Length - 1   sum_all_people += Double.Parse(lines(index)(1))   sum_all_area += Double.Parse(lines(index)(2))  Next  MsgBox("総人口は " & sum_all_people.ToString() & " 人" & _   vbCrLf & "総面積は " & sum_all_area.ToString() & " km2", _   MsgBoxStyle.OKOnly, "日本全国") End Sub ---------------------------------------- REM CSV ファイル読み込み処理 Function ReadCSV(ByVal szFileName As String) As String()()  REM (全般) に Imports 追記  REM Imports System.IO  REM Imports System.Text  Dim arrayTempLines()() As String = {}  REM ストリームを開く  Dim reader As New IO.StreamReader(szFileName, System.Text.Encoding.Default)  Dim iIdx As Integer = 0  REM 一気に読み込む  Dim szData As String = reader.ReadToEnd()  REM 不要な文字を取り除く  szData = szData.Replace(vbCr, "")  REM 改行で分離して配列に格納  Dim arrayLines() = szData.Split(vbLf)  Dim szLine As String  For Each szLine In arrayLines   Dim iCount As Integer = 0   Dim szTemp As String = ""   Dim bValid As Boolean = False   If szLine.Length > 1 Then    REM 配列の追加    ReDim Preserve arrayTempLines(iIdx)    REM カンマ区切りで分離して配列に格納    arrayTempLines(iIdx) = szLine.Split(",")    REM データのチェック    If arrayTempLines(iIdx).Length > 2 And _     arrayTempLines(iIdx)(0) <> "" Then bValid = True    REM 不要データを除く    For Each szTemp In arrayTempLines(iIdx)     arrayTempLines(iIdx)(iCount) = _     szTemp.Replace(Chr(34), "").TrimEnd()     iCount += 1    Next    REM 配列数チェック    If bValid Then iIdx += 1   End If  Next  REM 配列の切り詰め  ReDim Preserve arrayTempLines(iIdx - 1)  ReadCSV = arrayTempLines End Function ------------------------

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.2

まずはお詫びと訂正です。 ANo.1 から引用 > フィールドを prefectures()、population()、area() などの > 変数配列に格納、必要であれば地方の識別子として block() > なども これは二次元配列に格納すれば済む話でした、申し訳ありません。 ANo.1 での記述を忘れましたが、TextFieldParser を使う話です。 CSVファイルを読み込むには?[2.0のみ、C#、VB] - @IT http://www.atmarkit.co.jp/fdotnet/dotnettips/487csvparser/csvparser.html TextFieldParser と FieldType.Delimited と SetDelimiters(",") を組み合わせると カンマ区切りの箇所で分割されて配列に格納されるということです。 この場合は結果的に二次元配列に取り込むことになります。 Dim data()() As String FILE.CSV というファイルの読み込む例として ※ FILE.CSV に空の行、つまり改行のみしかない場合はエラーに   なるので注意してください。 Dim tfp As New TextFieldParser("FILE.CSV", _  System.Text.Encoding.GetEncoding("Shift_JIS")) tfp.TextFieldType = FieldType.Delimited tfp.SetDelimiters(",") Dim index As Interger = 0 While Not tfp.EndOfData  ReDim Preserve data(index)  data(index) = tfp.ReadFiles()  index += 1 End While 配列に格納されるデータは次のようになると思われます。 data(0)(0) に「北海道」 data(0)(1) に「北海道の人口」 data(0)(2) に「北海道の面積」 ... data(46)(0) に「沖縄県」 data(46)(1) に「沖縄県の人口」 data(46)(2) に「沖縄の面積」 全国の合計であれば、人口や面積の値を合計すればよいわけです。 for とか使って配列のインデックスを変えていけば実現可能。 全国の人口であればこれで求められると思われます。 Dim index As Integer For index = 0 To data.Length - 1  sum_all += data(index)(1) Next index 面積の合計はあなたご自身で考えてはいかがでしょうか? > CSVファイルには地方名や地方コードは書かれていません。 では、プログラムの中で地方に仕訳するためのデータを持つしかないのでしょう。 > 上から何番目から何番目までを東北地方、何番目から何番目までを関東地方 > というふうに抜粋して識別するしかないと思っていたのですが > そのやりかたもいまいちわかりません……。 これも配列に持たせますか? > CSVファイルを読み込むということは、配列を用意しなければならないのでしょうか? StreamReader で一行毎に文字列に読み込み、Split で都道府県、人口、 面積にわけます、この場合は一次元配列になので初めて配列を扱うということで あれば二次元配列よりは簡単だと思います。 この方法はあなたがお考えになってプログラミングに挑んでみてください、もし行き詰まって しまったら、エラーや問題になったコードを提示されて相談なさってください。

laybial
質問者

補足

ありがとうございます。 読み込みについては、StreamReaderを使うとエラーが出るので FileOpenと、LineInputを使用しました。 (書き忘れましたが、使用しているのは、VB.NET 2003です) >Dim index As Integer >For index = 0 To data.Length - 1 > sum_all += data(index)(1) >Next index これを書いてみると、「Lengthはdataのメンバではありません」というエラーが出ます。 人口や面積の合計を出すにはfor文を使うことはわかりましたが 合計するための数値を抜き出す方法がわかりません。 Splitを使って、都道府県名と、人口と、面積を分けて その中から人口だけを必要な数だけ抜き出して、数値を足す という部分がどうにもわからない状態です。 たびたびの質問で申し訳ありませんが、よろしくお願いします。

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.1

> 複数の行にまたがっている情報をひとつにまとめて表示させる > というのがよくわかりません。 この「ひとつにまとめる」というのは何を意味するのかが、わかりません。 ※ 質問返しのようで申し訳ありませんが確認のためですので。 ひとつにまとめるとは配列に格納して処理したいという意味でしょうか? ※ 引用が前後しますが。 > 1:都道府県(北海道、岩手県、神奈川県、兵庫県など) > 2:各都道府県の人口 > 3:各都道府県の面積 > 3つの情報は、すべてカンマで区切られています。 > 各都道府県ですので、47行にわたって情報が書かれています。 要するにフォーマットは [北海道], [xxxx], [xxxx] ... [沖縄県], [xxxx], [xxxx] のようになっているのでしょうか? これらを 47 個の配列に読み込みたいのでしょうか? > まず、ボタン1を押したときに、CSVファイルを読み込み > 日本の総人口と総面積をラベルに表示させます。 配列に入れた数値(人口や面積)を集計するという意味でよろしいでしょうか? > 次に、日本を10のエリアに分け(関東地方、近畿地方など) この地方毎に分ける際の識別はどうなさるのでしょうか? CSV ファイルに地方名か地方コード等の情報もないと仕訳が大変かと思われます。 まとめると次のようなことがなさりたいのでしょうか? 1. CSV を配列に読み込む  あらかじめ 47 個の配列を用意するか、ReDim などを用いる  ここで StreamReader を使うということならば、それぞれの  フィールドを prefectures()、population()、area() などの  変数配列に格納、必要であれば地方の識別子として block()  なども 2. 全国の集計  単純に配列の数だけループさせるなどして集計する。  (他の方法もあると思いますが) 3. エリア別集計  これは前述のように地区ごとに識別する何かが必要かと思われます。  CSV のファイルフォーマットが  東京都, [xxxx], [xxxx], 関東  のようになっていないと難しいのではないでしょうか?

laybial
質問者

補足

ありがとうございます。 >要するにフォーマットは >[北海道], [xxxx], [xxxx] ... >[沖縄県], [xxxx], [xxxx] >のようになっているのでしょうか? そうです。そのように書かれています。 ひとつにまとめるというのは、たとえば、日本の総人口でしたら 47個の都道府県別の人口をすべて足した数をラベルに表示させる という意味です。 地域別でしたら、東北地方だけの人口をすべて足す、という感じです。 >この地方毎に分ける際の識別はどうなさるのでしょうか? >CSV ファイルに地方名か地方コード等の情報もないと仕訳が大変かと思われます。 CSVファイルには地方名や地方コードは書かれていません。 上から何番目から何番目までを東北地方、何番目から何番目までを関東地方 というふうに抜粋して識別するしかないと思っていたのですが そのやりかたもいまいちわかりません……。 やりたいことは、ご指摘のとおりです。 CSVファイルを読み込むということは、配列を用意しなければならないのでしょうか?

関連するQ&A

  • VBScriptでcsvファイルの編集は出来ますか

    プログラミング初心者です。 ネットや本で調べてみたのですが、どうもわからなかった為、 ここに質問を挙げさせていただきました。 今、担当している仕事で、ASPのファイルを作成しています。 機能としては、あるCSVファイル(test.csv)から 列の値を指定し、その値を含んでいる行を検索し、 その行の値をテキストボックスにそれぞれ表示させ修正(他の行の値は変更しない。)、 もしくは選択した行のみの削除(値を無くすのではなく、行自体の削除)を行いたいのです。 (例) ■修正 test.csvの内容が下記のような場合、 国   |  地方  |  都道府県  ++++++++++++++++++++++++++ 日本 |  関東  |  東京 日本 |  東北  |  青森 日本 |  九州  |  福岡 1.「地方」の列から「東北」の行を選択し、それぞれの値をテキストボックスに表示。 2.1で選択した行の都道府県を「秋田」に変更し、上書き。 3.test.csvの内容が下記のように変更されている。 国   |  地方  |  都道府県  ++++++++++++++++++++++++++ 日本 |  関東  |  東京 日本 |  東北  |  秋田 日本 |  九州  |  福岡 ■削除 1.「地方」の列から「関東」の行を選択し、それぞれの値をテキストボックスに表示。 2.1で選択した行を削除し、上書き。 3.test.csvの内容が下記のように変更されている。 国   |  地方  |  都道府県  ++++++++++++++++++++++++++ 日本 |  東北  |  青森 日本 |  九州  |  福岡 ※前提条件として、1つの列内には同じ値は入らないものとします。 いろいろ調べてみて検索、表示は何とかできそうなのですが、 修正や削除の方法がわかりませんでしたので、 お手数をおかけして申し訳ありませんが、ご存知の方がいらっしゃったら 参考になるソースのご教示をお願い出来ますでしょうか。 初心者ということもあり、そもそもこのような機能をASP(VBScript)で行えるのでしょうか? その点についても、教えていただけると嬉しいです。

  • csvファイルについて

    javaで、csvファイルを読み取り、データベースにいれるツールを作成しています。 csvファイルを読み込む部分でつまづいてしまったので、どなたかご教授ください! 指定されたcsvファイルを一行ずつ取り込むのですが、一つの情報が2行以上になってしまうデータがいくつかあり、ファイルチェックとして、1つ目のカラムは何文字のものだとかしているけれども、その前の行の続きに当たる行が、その条件から外れてしまい、エラーになってしまいます。(当たり前ですが、、、) なぜ、csvファイルが一行に収まらないのかが、わかずですし、それを一行として読み込むことができるのかが不明で困っております。   原因や対処法が分かれば、教えていただければと思います。 よろしくお願いします。

  • csvファイルでの出力について

    C言語初心者です。 プログラミングにおいて質問なのですが、csvファイルを読み込み、 そのデータを用いて計算し、csvファイルで出力するという問題なのですが、C言語においてcsvファイル形式で出力するにはどのような方法がありますか? 補足:ラベル行に全角文字を入力しないといけません。

  • リンク集をCSVファイルで管理し、JavaScriptで表示

    お世話になります。 いつも素晴らしいアドバイスをありがとうございます m(__)m 本日は【リンク集をCSVファイルで管理し、JavaScriptで表示】したく 投稿させていただきました。 ◇JavaScriptでCSVファイル読み込み表示 5~10個のリンクを表示したい 1行目はアンカーテキスト、2行目にURL ◇CSVのデータをランダムに表示 上記のようにJavaScriptで管理する方法が可能でしょうか。 アドバイスお願いいたします。 現在、JavaScriptの勉強を始めたまったくの素人でございます。 参考になるサイト、書籍の情報もお願いいたします。

  • C++でのcsvファイル読み込みについて

    C++でのcsvファイル読み込みについて質問です. 読み込みcsvファイルの規模は300*1000として,その情報をdouble型の2次元配列に格納したいですが,ネットでいろいろ調べたり自分でコードを作ってみてもabort()has been calledなどいくつかエラーが表示されてしまい先に進めません. csvファイル名をa.csv,格納したい2次元配列をA[300][1000]などとしてサンプルコードを提供してくださいますと幸いです. 質問前に散々調べましたがプログラミング初心者でして今現在の力では対応できませんでした.申し訳ありませんが何卒ご教示お願いします.

  • とても大きなCSVファイルをEXCELで見たい。

    今、手元にとても大きなサイズのCSVファイルがあります。 そのファイルは、行は1800行なのですが、列は256行以上あり何列あるかわかりません。 EXECL2000で開くと全ては開けなかったと表示されてしまいます。 なんとか、EXCELでこのファイルを見ることはできないでしょうか? または、CSVファイルの列を分割できるようなソフトを ご存知ないでしょうか? よろしくお願いします。

  • c#で(",")区切りのcsvファイルから読み込みを行うには?

    駆け出しの初心者です。 以前c言語を少々勉強していてcsvファイルの読み込み、書き出しを練習していたのですが、最近c#を使うようになり、その便利さに圧倒されております。 今回c#で読み込みたいcsvファイルは以下のようになっております "abc","123","あいうえお" ただのカンマ区切りであれば読み込みは簡単ですが、 上記のようにダブルクオーテーションでそれぞれの文字列が囲まれている場合に文字列だけを読み込み、配列に代入していくのに何かスムーズな方法はありませんでしょうか? ちなみに現在単純にカンマ区切りのcsvファイルを読み込むコードを 書いた所ですので、載せておきます これをいじってスムーズにいければうれしいのですが、いかがでしょうか? private void LoadData() { string path = "Data.csv"; string delimStr = ",";//区切り文字 char[] delimiter = delimStr.ToCharArray(); string[] strData;//分解後の文字用変数 string strLine;//1行分のデータ Boolean fileExists = System.IO.File.Exists(path); if (fileExists) { System.IO.StreamReader sr = new System.IO.StreamReader( path, System.Text.Encoding.Default); while (sr.Peek() >= 0) { strLine = sr.ReadLine(); strData = strLine.Split(delimiter); DataSet.DataTable.AddDataTableRow( DateTime.Parse(strData[0]), strData[1],    strData[2], int.Parse(strData[3]), strData[4]); } sr.Close(); } } いつも丁寧な回答で協力してくれる皆様には心から感謝しております。 どうぞよろしくお願いします。

  • CSVファイルからのデータ読み込み・自動化

    困っていること: 私たちの事業は、食品関連の個別注文対応を行っており、Shopifyを使用したウェブサイトから注文を受けています。注文情報はCSVファイルとして出力され、購入者の名前と個別に診断された食事量をラベルに印刷し、製品に貼り付ける必要があります。 これらを実現するため、CW C4020プリンターと連携可能なラベル作成ソフトウェア、または必要に応じて追加の外部ソフトウェアやカスタムスクリプトの開発についてご相談させていただきたく存じます。 お問い合わせの主な内容は、「CSVファイルを読み込み、ラベルの特定の位置にCSVファイルに記入された項目のテキストを自動的に挿入する方法・手段、または代替案」についてのご教示をいただきたいと考えております。 何卒ご協力のほど宜しくお願い申し上げます。 <利用環境> 製品型番:CW C4020 XB36000173 OS:Windows11 ※OKWAVEより補足:「EPSON社製品」についての質問です。

  • csvファイルの読込みとソート

    いつも大変参考にさせていただいております。 csvファイルの読み込みとソートをしたく、ネットや過去ログ等を相当調べたのですが、完全に詰まってしまいました。 (検索キーワード:「php csv ソート」「php 二次元配列 ソート」など) とても困っています。どなたかよろしくお願いします。 以下のようなcsvファイルを読み込みソートしたいのです。 ■csvファイル 20110803, A, りんご 20111215, B, みかん 20110306, A, みかん 20110620, A, りんご 20110215, B, りんご ■個別にやりたい処理 (1)、左列の日付で昇順ソートしてすべて表示 (2)、「A」を含む行をすべて表示(日付順) (3)、「A」+「りんご」を含む行をすべて表示(日付順) □補足 csvをfgetcsvで読み込み、テーブルに入れて表示するところまではできました。 csvの行は増えていきます(max100行位)。列は固定。

    • ベストアンサー
    • PHP
  • C# datagridview csv 読込

    datagridviewにcsvファイルを読み込んでいるのですが,csvファイル内の行列数分のみ列数・行数をdatagridviewに生成したいのですが,どうも必要以上の列数・行数を生成してしまいます. 下記にそのプログラムを記載いたします. どなたか,必要分のみするにはどうすればよろしいかご教授願えないでしょうか? private void button1_Click(object sender, EventArgs e) { string strName = "xxx.csv"; // 仮のファイル名 string strPath = "c:/csv/"; // 仮のディレクトリ名 OpenFileDialog sfd = new OpenFileDialog(); sfd.InitialDirectory = strPath; sfd.FileName = strName; sfd.Filter = "CSVファイル(*.csv)|*.csv|xlsファイル(*.xls)|*.xls|xlsxファイル(*.xlsx)|*.xlsx|テキスト(*.txt)|*.txt"; sfd.Title = "開くファイルを選択してください"; sfd.RestoreDirectory = true; sfd.CheckFileExists = false; if (sfd.ShowDialog() == DialogResult.OK) { // CSVファイルオープン System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName); // CSVファイルの各セルをDataGridViewに表示 int r = 0; String lin = ""; do { lin = sw.ReadLine(); if (lin != null) { dataGridView1.Columns.Add("clmName1", "日付"); this.dataGridView1.Columns.Add("Time","データ"); this.dataGridView1.Rows.Add(); String[] csv = lin.Split(','); for (int c = 0; c <= csv.GetLength(0) - 1; c++) { if (c < this.dataGridView1.Columns.Count) { this.dataGridView1.Rows[r].Cells[c].Value = csv[c]; } } r += 1; } } while (lin != null); // CSVファイルクローズ sw.Close(); }

専門家に質問してみよう