初めての店舗開業を成功させよう>>

いくつかこまごまとしたものをまとめてご質問させて頂きますが,

1)csvファイルを読込,ある処理を行おうとすると
「列の FillWeight 値の合計が 65535 を超えることはできません。」
というエラーが出て処理が出来ません.このエラーの解消法を教えて頂けないでしょうか?

2)画像のように読み込んだヘッダー部分が文字化けしてしまいます.
こちらの解消法をご教授頂けないでしょうか?

3)csvのすべてのデータをdatagridviewに表示させたいのですが,2列分しか表示されません.
下記に2)とも関連したプログラムを記載いたします.どなたかご教授願えないでしょうか?

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)
{

if (r == 0)
{
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();
tabControl1.SelectedIndex = 1;
}

「C# datagridview」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (3件)

元のCSVを提示していただいたほうがいいかも



データは何列必要なんでしょう
また CSVの文字コードは何で保存してありますか? Shift-JISでしょうか

この回答への補足

とりあえずデータは30列ぐらい必要です.

文字コードはおそらくおっしゃられているものです.

ご教授願いいたします.

補足日時:2011/11/23 11:49
    • good
    • 0

この書き方なら エンコードによる文字化けではないように思えます



30列追加ということであれば CSVの読み込みループの中で列の追加というより
読み込みループに入る前に 列の設定をする方向だと思います

if (sfd.ShowDialog() == DialogResult.OK)
{
  // ここで列の追加を行う
  dataGridView1.Columns.Add("clmName1", "日付");
  for ( int n = 1; n < 31; n++ )
  {
    String ss1 = String.Format("Time{0}", n );
    String ss2 = String.Format("データ{0}", n );
    this.dataGridView1.Columns.Add(ss1,ss2);
  }
  // ココまでを追加
  // 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)
    {
      // ここはコメントアウト  
      // if (r == 0)
      // {
      //   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();
  tabControl1.SelectedIndex = 1;
}
    • good
    • 0

文字化けが Shift-JISによるものなら



System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName);
を エンコードつきのコンストラクターに変えましょう
System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName, System.Text.Encoding.GetEncoding(932));

といった具合です

この回答への補足

ありがとうございます.

追記で保存の場合でも同じように定義してやれば

文字を文字化けさせずに保存できるのでしょうか?

参考に同じように保存する際に定義しているプログラムを書きに記載いたします.

ご教授よろしくお願いいたします.

// ファイルを指定してインスタンス作成
System.IO.StreamWriter sw = new System.IO.StreamWriter(sfd.FileName);

補足日時:2011/11/23 12:17
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDataGridViewでセルクリックイベントを発生させるには

DataGridViewでセルクリックイベントを発生させるには、
デザイナからではCellClickイベントハンドラとなりますが、
プログラムコード上から発生させるにはどのようにすればよろしいでしょうか?

CurrentCellでアクティブセルを変更した時に、そこのセルをクリックさせるイベントが欲しいのですが・・

宜しくお願い致します。

Aベストアンサー

CellClickイベントハンドラの内容を別のメソッドとして作り、アクティブセルを変更した際にそのメソッドを呼び出す方法ではダメなのでしょうか?
どうしてもCellClickイベントを発生させて処理をしたいのでしょうか?

QC# ログイン画面からメイン画面への画面遷移について

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示することがある為)

---------------------------------------------------------------------
private void LoginButton_Click(object sender, EventArgs e)
{
   /* ログイン処理 */

   //ログイン成功時
   //メイン画面インスタンス生成
   MainForm mainForm = new MainForm();
   //ログイン画面インスタンスを代入
   mainForm.loginForm = this;
   //メイン画面表示
   mainForm.Show();
   //ログイン画面非表示
   this.Visible = false;
}
---------------------------------------------------------------------

また上記の方法だとメイン画面を閉じても、アプリケーションは終了しない為
メイン画面の閉じるボタンを押した場合に以下の処理を行っています。

---------------------------------------------------------------------
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
   //ログイン画面クローズ
   loginForm.Close();
}
---------------------------------------------------------------------

以上、宜しくお願いします。

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示す...続きを読む

Aベストアンサー

#2です。
最初にログイン画面のみを表示したいなら
メイン画面のForm_menu_Load(loadイベント処理)
の中で、ログイン画面をモーダル表示し、
NGならメイン画面のcloseのほうがよいかも知れません。

QC# 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();
}

datagridviewにcsvファイルを読み込んでいるのですが,csvファイル内の行列数分のみ列数・行数をdatagridviewに生成したいのですが,どうも必要以上の列数・行数を生成してしまいます.

下記にそのプログラムを記載いたします.
どなたか,必要分のみするにはどうすればよろしいかご教授願えないでしょうか?

private void button1_Click(object sender, EventArgs e)
{
string strName = "xxx.csv"; // 仮のファイル名
string strPath = "c:/csv/"; // 仮のディレクトリ名
...続きを読む

Aベストアンサー

以下のように修正してみてください
do
{
  lin = sw.ReadLine();
  if (lin != null)
  {
    if ( r == 0 ) // これを追加
    {        // 最初だけカラムを設定
      dataGridView1.Columns.Add("clmName1", "日付");
      this.dataGridView1.Columns.Add("Time","データ");
    }
    else
    {       // データ行の追加
      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);
といった具合です
# 字下げには全角スペースを使用しているのでエラーになるなら半角スペースに置換して下さい

以下のように修正してみてください
do
{
  lin = sw.ReadLine();
  if (lin != null)
  {
    if ( r == 0 ) // これを追加
    {        // 最初だけカラムを設定
      dataGridView1.Columns.Add("clmName1", "日付");
      this.dataGridView1.Columns.Add("Time","データ");
    }
    else
    {       // データ行の追加
      this.dataGridView1.Rows.Add();
      String[] csv = lin.Split(',');
      for (int c = 0; c <= ...続きを読む

Qデータグリッドビューの一番最初の行に列を追加したい

お世話になっています。
VB2005です。
タイトル通りなのですが、DataGridViewの一番最初の列(0列目)に列を追加したいのです。
DataGridView1.Columns.Add()
では一番最後の行に追加されてしまいます。

ヘルプやネット上を見てもわからず・・・
どなたかご存じの方教えてください。

Aベストアンサー

こんばんは。

AddではなくInsertを使います。

TextBoxColumnを追加します。

Dim TextBoxColumn As New DataGridViewTextBoxColumn
Me.DataGridView1.Columns.Insert(0, TextBoxColumn)

でとりあえず追加できます。

後はヘッダーに項目名を設定したり、列幅を設定し足してください。

QC#でプログラミング。 csvファイルへの書き込みについて

フォームに貼ったtextboxやlistboxの内容をボタンを押すことで、
csvファイルで書き出したいと考えています。

C#は初心者なので調べてみてもよくわからずにいます。

どのようにしたらよいのでしょうか??
また、いいサイトなどをご存知の方がいましたら教えてください。

Aベストアンサー

http://dobon.net/vb/dotnet/file/writecsvfile.html
とりあえず、見つかりました。

csvは数値のみなどの表を保存するのには向いていますが、フォームで入力された値などを保存するには不向きで、app.configなどを使う方がよろしいかと…あくまでも私見ですが。

Qc#で(",")区切りの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();
}


}


いつも丁寧な回答で協力してくれる皆様には心から感謝しております。
どうぞよろしくお願いします。

駆け出しの初心者です。
以前c言語を少々勉強していてcsvファイルの読み込み、書き出しを練習していたのですが、最近c#を使うようになり、その便利さに圧倒されております。

今回c#で読み込みたいcsvファイルは以下のようになっております
"abc","123","あいうえお"

ただのカンマ区切りであれば読み込みは簡単ですが、
上記のようにダブルクオーテーションでそれぞれの文字列が囲まれている場合に文字列だけを読み込み、配列に代入していくのに何かスムーズな方法はありませんでしょうか?


ちなみに...続きを読む

Aベストアンサー

こう応用するとよいです。
以下に全コードを載せておきますが、ポイントはこの一行です。
strData = strLine.Split(delimiter);

strData = CsvToArrayList1(strLine)[0];


private void LoadData() {
string path = "Data.csv";
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 = CsvToArrayList1(strLine)[0];//変更点
DataSet.DataTable.AddDataTableRow(
DateTime.Parse(strData[0]),
strData[1],
strData[2],
int.Parse(strData[3]),
strData[4]);
}

sr.Close();
}
}


//参照先<http://dobon.net/vb/dotnet/file/readcsvfile.html>
//参照先だとArrayListを返し値にしていますが使いづらいので、List<string[]>に変更しています。
public static System.Collections.Generic.List<string[]> CsvToArrayList1(string csvText) {
System.Collections.Generic.List<string[]> csvRecords =
new System.Collections.Generic.List<string[]>();

//前後の改行を削除しておく
csvText = csvText.Trim(new char[] { '\r', '\n' });

//一行取り出すための正規表現
System.Text.RegularExpressions.Regex regLine =
new System.Text.RegularExpressions.Regex(
"^.*(?:\\n|$)",
System.Text.RegularExpressions.RegexOptions.Multiline);

//1行のCSVから各フィールドを取得するための正規表現
System.Text.RegularExpressions.Regex regCsv =
new System.Text.RegularExpressions.Regex(
"\\s*(\"(?:[^\"]|\"\")*\"|[^,]*)\\s*,",
System.Text.RegularExpressions.RegexOptions.None);

System.Text.RegularExpressions.Match mLine = regLine.Match(csvText);
while(mLine.Success) {
//一行取り出す
string line = mLine.Value;
//改行記号が"で囲まれているか調べる
while((CountString(line, "\"") % 2) == 1) {
mLine = mLine.NextMatch();
if(!mLine.Success) {
throw new ApplicationException("不正なCSV");
}
line += mLine.Value;
}
//行の最後の改行記号を削除
line = line.TrimEnd(new char[] { '\r', '\n' });
//最後に「,」をつける
line += ",";

//1つの行からフィールドを取り出す
System.Collections.Generic.List<string> csvFields =
new System.Collections.Generic.List<string>();
System.Text.RegularExpressions.Match m = regCsv.Match(line);
while(m.Success) {
string field = m.Groups[1].Value;
//前後の空白を削除
field = field.Trim();
//"で囲まれている時
if(field.StartsWith("\"") && field.EndsWith("\"")) {
//前後の"を取る
field = field.Substring(1, field.Length - 2);
//「""」を「"」にする
field = field.Replace("\"\"", "\"");
}
csvFields.Add(field);
m = m.NextMatch();
}

csvFields.TrimExcess();
csvRecords.Add(csvFields.ToArray());

mLine = mLine.NextMatch();
}

csvRecords.TrimExcess();
return csvRecords;
}

/// <summary>
/// 指定された文字列内にある文字列が幾つあるか数える
/// </summary>
/// <param name="strInput">strFindが幾つあるか数える文字列</param>
/// <param name="strFind">数える文字列</param>
/// <returns>strInput内にstrFindが幾つあったか</returns>
public static int CountString(string strInput, string strFind) {
int foundCount = 0;
int sPos = strInput.IndexOf(strFind);
while(sPos > -1) {
foundCount++;
sPos = strInput.IndexOf(strFind, sPos + 1);
}

return foundCount;
}

こう応用するとよいです。
以下に全コードを載せておきますが、ポイントはこの一行です。
strData = strLine.Split(delimiter);

strData = CsvToArrayList1(strLine)[0];


private void LoadData() {
string path = "Data.csv";
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...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

Qc#による実行ファイルの作成方法

using System;
class test
{
public static int Main(string[] args)
{
int x = args.Length;
for (int i = 0; i < x; i++)
Console.WriteLine("{0}, {1}", i, args[i]);

return 0;
}
}

上記のプログラムをvisual c# 2010 expressで
ビルドした後、コマンドプロンプトから
test.exe aaa bbb ccc

と入力し引数を渡して呼び出そうとしたのですが、
「'test.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
と表示されうまくいきませんでした。
test.csを保存したうえで今度はフルパスでの入力や、
csc test.csなども試してみましたが、ダメでした。

参考書には「ビルドをすることでexeの実行ファイルが作成される」と書かれているのですが、
PC内にtest.exeは見当たりません。

コマンドライン引数が渡せないのは実行ファイルが生成されていないためだと思うのですが、
まだ始めたばかりで解決の糸口もわからない状況です。
何かヒントになるようなことでもいいので教えていただけると助かります。

using System;
class test
{
public static int Main(string[] args)
{
int x = args.Length;
for (int i = 0; i < x; i++)
Console.WriteLine("{0}, {1}", i, args[i]);

return 0;
}
}

上記のプログラムをvisual c# 2010 expressで
ビルドした後、コマンドプロンプトから
test.exe aaa bbb ccc

と入力し引数を渡して呼び出そうとしたのですが、
「'test.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
と表示されうまくいきませんでした...続きを読む

Aベストアンサー

プロジェクトの中の実行ファイルができる、
binフォルダ下のdebugフォルダの名前指定が長すぎて面倒なときは、
エクスプローラでdebugフォルダのとこを右クリック、プロパティで出てくる
「場所」ってとこのc:\から始まるところをドラッグしてコピー、
コマンドプロンプトを起動して
「cd (スペース)」と入力、右クリックして張り付けると速いですよ。

或いはVisualStudio2010で作るプロジェクトなどは
Cドライブ直下にWorspaceみたいな名前のフォルダを作って
そこでプロジェクトを作るようにしたり、
できた実行ファイルだけをc:\Workspaceにコピーしたりすると
場所が分かりやすくて
cdなどのDOSコマンド入力も
実行そのものもラクかもしれません。



<以下はおまけで>
あとはプログラムのreturn 0;の一つ前の行に
Console.ReadLine();
を入れて、
VisualStudi2010のメニュー[プロジェクト]-[アプリケーション名のプロパティ]で開く画面の中に
デバッグというタブが左側に出てくるのでそれをクリック、
コマンドライン という項目に aaa bbb ccc と実行したいアーギュメント(引数)を随時入力してあげて保存、
ビルドした後
緑の横△(実行)ボタンを押すとコマンドプロンプト(コマンドコンソール)画面が残った上に結果も見れて
ちょっとハッピーになれるかもしれません。

プロジェクトの中の実行ファイルができる、
binフォルダ下のdebugフォルダの名前指定が長すぎて面倒なときは、
エクスプローラでdebugフォルダのとこを右クリック、プロパティで出てくる
「場所」ってとこのc:\から始まるところをドラッグしてコピー、
コマンドプロンプトを起動して
「cd (スペース)」と入力、右クリックして張り付けると速いですよ。

或いはVisualStudio2010で作るプロジェクトなどは
Cドライブ直下にWorspaceみたいな名前のフォルダを作って
そこでプロジェクトを作るようにしたり、
できた実...続きを読む


人気Q&Aランキング

おすすめ情報