C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: DateGridViewにcsvファイルの内容を表示


(過去ログ 93 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■55315 / inTopicNo.1)  DateGridViewにcsvファイルの内容を表示
  
□投稿者/ daibo (1回)-(2010/11/26(Fri) 15:44:15)

分類:[C#] 

2010/11/26(Fri) 16:04:58 編集(投稿者)
2010/11/26(Fri) 16:04:17 編集(投稿者)

<pre><pre>初質問です。よろしくお願いします。開発環境はWindows 7 使用言語はVisual Studio C# 2010 Expressです。

最近C#の勉強を始めたのですが、表題のようなプログラムを作成しようとして、ビルドは正常に終了するのですが、実行時に
「入力配列がこのテーブルの列数より長い値です。」とエラーになります。

表示したいcsvファイルは列数5行数5のもので、最終的には完成したら列数10行数365のcsvファイルを表示したいと目論んでいるのですが...

以下にソースコードを書きますので、アドバイスやご指摘ありましたらよろしくお願いします。

↓ソースコード
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Data.SqlClient;
using System.ComponentModel;
using Microsoft.VisualBasic.FileIO;
using Microsoft.VisualBasic.Devices;
/*using System.Drawing;
using System.Linq;
using System.Text;*/
using System.Windows.Forms;



namespace _20101126_2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//データテーブル
DataTable dt = new DataTable();
DataRow row = null;

//フィールド(列)の追加
dt.Columns.Add("A", Type.GetType("System.Int64"));
dt.Columns.Add("B", Type.GetType("System.Int64"));
dt.Columns.Add("C", Type.GetType("System.Int64"));
dt.Columns.Add("D", Type.GetType("System.Int64"));
dt.Columns.Add("E", Type.GetType("System.Int64"));

//カンマ区切りのテキストを読み込み、テーブルに追加
TextFieldParser pa = null;
pa = FileSystem.OpenTextFieldParser(@"C:\Users\Desktop\test.csv", ",");
//pa = new TextFieldParser(@"C:\Users\Desktop\test.csv", System.Text.Encoding.GetEncoding("Shift_JIS"));
while (!pa.EndOfData)
{
row = dt.NewRow();
row.ItemArray = pa.ReadFields();
dt.Rows.Add(row);
}
pa.Close();

//データグリッドビューにセット
dataGridView1.DataSource = dt;
}

private void Form1_Load(object sender, EventArgs e)
{
this.Opacity = 0.9;
}
}
}</pre></pre>
引用返信 編集キー/
■55316 / inTopicNo.2)  Re[1]: DateGridViewにcsvファイルの内容を表示
□投稿者/ shu (203回)-(2010/11/26(Fri) 15:56:23)
No55315 (daibo さん) に返信
> 「入力配列がこのテーブルの列数より長い値です。」とエラーになります。
この内容からするとcsvファイルの列数が5より大きい行があるように思えます。
引用返信 編集キー/
■55317 / inTopicNo.3)  Re[2]: DateGridViewにcsvファイルの内容を表示
□投稿者/ daibo (3回)-(2010/11/26(Fri) 16:03:09)
No55316 (shu さん) に返信
> この内容からするとcsvファイルの列数が5より大きい行があるように思えます。
早速の回答ありがとうございます。
肝心のcsvファイルの内容なのですが、
A B C D E
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
としたものでテストしています。
何か不具合ありますか?

引用返信 編集キー/
■55318 / inTopicNo.4)  Re[3]: DateGridViewにcsvファイルの内容を表示
□投稿者/ shu (204回)-(2010/11/26(Fri) 16:17:40)
No55317 (daibo さん) に返信
> ■No55316 (shu さん) に返信
>>この内容からするとcsvファイルの列数が5より大きい行があるように思えます。
> 早速の回答ありがとうございます。
> 肝心のcsvファイルの内容なのですが、
> A B C D E
> 0 1 2 3 4
> 5 6 7 8 9
> 10 11 12 13 14
> 15 16 17 18 19
> 20 21 22 23 24
> としたものでテストしています。
> 何か不具合ありますか?
>
間に『,』があるとして列数は大丈夫そうに見えますね。最後に『,』はないですよね?
先頭行が数字でないのは別の意味で駄目です(Int64のフィールドへ値を設定出来ません)。

> row.ItemArray = pa.ReadFields();
でブレークして pa.ReadFields(); の内容を評価してみてはどうでしょう?




引用返信 編集キー/
■55322 / inTopicNo.5)  Re[4]: DateGridViewにcsvファイルの内容を表示
□投稿者/ daibo (4回)-(2010/11/26(Fri) 16:37:16)
No55318 (shu さん) に返信
> ■No55317 (daibo さん) に返信
>>■No55316 (shu さん) に返信
> >>この内容からするとcsvファイルの列数が5より大きい行があるように思えます。
>>早速の回答ありがとうございます。
>>肝心のcsvファイルの内容なのですが、
>>A B C D E
>>0 1 2 3 4
>>5 6 7 8 9
>>10 11 12 13 14
>>15 16 17 18 19
>>20 21 22 23 24
>>としたものでテストしています。
>>何か不具合ありますか?
>>
> 間に『,』があるとして列数は大丈夫そうに見えますね。最後に『,』はないですよね?
> 先頭行が数字でないのは別の意味で駄目です(Int64のフィールドへ値を設定出来ません)。
>
>>row.ItemArray = pa.ReadFields();
> でブレークして pa.ReadFields(); の内容を評価してみてはどうでしょう?
>
>
いただいたアドバイスの通りにブレークポイントを設置し、row.ItemArray = pa.ReadFields();の内容を見てみたところ、値のところに{}だけ表示されていました。
引用返信 編集キー/
■55323 / inTopicNo.6)  Re[5]: DateGridViewにcsvファイルの内容を表示
□投稿者/ PATIO (58回)-(2010/11/26(Fri) 16:48:20)
2010/11/26(Fri) 16:53:38 編集(投稿者)
2010/11/26(Fri) 16:52:00 編集(投稿者)

本来、CSVファイルは改行で区切られた一行を一つのレコードと考え、
各フィールドをカンマ区切りで記述したファイルの事を指すのですが、
その事は理解されていますか?
提示されているファイルの内容を素直に取るとCSVファイルになっていない
ように思えますけれど。

その上でOpenTextFieldParserに渡している引数と渡しているファイルの内容は
きちんとあっていると言えるでしょうか?

いきなり全体を見てわかろうとするのではなくて一行一行の意味を確認しながら
進める事をお勧めします。

ReadFieldsの所で既にうまくいっていないようなのでその原因はどこかと
遡って見て行く必要があると思いますよ。
あと、自分のコードの悪い所を探す為の方法として
確実に動くサンプルを使って検証すると言う方法もあります。
サンプルとの差を見て悪い所を探すという方法ですね。
サンプルに関してはMSDNやWeb上の入門系サイトを見てみるという
方法もありますね。
(情報の取捨選択に自信がないうちは書籍の方が確実かなと言う気もしますけれど)

とにかくソースのパターンで覚えようとするのではなくて
各行の意味を理解しながら進める必要があると思いますよ。

引用返信 編集キー/
■55328 / inTopicNo.7)  Re[5]: DateGridViewにcsvファイルの内容を表示
□投稿者/ shu (206回)-(2010/11/26(Fri) 17:26:26)
No55322 (daibo さん) に返信
> いただいたアドバイスの通りにブレークポイントを設置し、row.ItemArray = pa.ReadFields();の内容を見てみ> たところ、値のところに{}だけ表示されていました。
『row.ItemArray = pa.ReadFields();』ではなくて『pa.ReadFields()』の内容ですが
評価すると1行分実行されてしまうかもしれないので一度変数に取得してその変数の内容を見た方が
確実ですね。

引用返信 編集キー/
■55331 / inTopicNo.8)  Re[6]: DateGridViewにcsvファイルの内容を表示
□投稿者/ マサヤ (179回)-(2010/11/26(Fri) 17:59:17)
FileSystem.OpenTextFieldParserを使用するより、
基本的なFileI/OのSteamReaderを使用したほうがいいかな、と思います。

そして一行をカンマ区切りでsplitしてあげるといいです。
そこでsplitした後に配列の個数をとって、一行が5つ超えたらエラーメッセージ表示など。

そもそも、このやり方だと配列を5つまでしか用意しないこともできるので、
「入力配列がこのテーブルの列数より長い値です。」というエラーは発生しません。

それはさておき、
[解決方法]
テストデータの数字の間に , を入れてください。
1,2,3,4,5
これでいいかと思われます。

引用返信 編集キー/
■55392 / inTopicNo.9)  Re[7]: DateGridViewにcsvファイルの内容を表示
□投稿者/ daibo (5回)-(2010/11/29(Mon) 12:12:38)
皆さん回答ありがとうございます。
まだまだ完成には程遠いのですが、皆さんのおかげで次にすべきことが分かりました。

またよろしくお願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -