c#でcsvから指定の1行だけを読み込む方法

このQ&Aのポイント
  • c#でcsvファイルから特定の文字列を含む1行だけを読み込みたい場合、どのようにコードを書けば良いでしょうか?c言語とは異なる方法があるのか、教えていただけると幸いです。
  • 今回はc#を使用してcsvファイルから特定の1行を読み込む方法について質問させていただきました。c言語ではstrstrを使用して特定の文字を含む1行だけを取得できましたが、c#ではより効率的な方法があるのか、ご教示いただけますと幸いです。
  • c#でcsvファイルの特定の行を読み込みたい場合、現在はファイル全体を読み込んでいる状況です。より効率的な方法があるのではないかと考えており、アドバイスを頂きたいです。
回答を見る
  • ベストアンサー

c#でcsvから指定の1行だけを読み込む方法

以前c言語で同じような質問をして、とても有益な回答を頂きましたが、 今回c#でのコードの書き方をご教示いただければと思い、再度質問致します。 例えば以下のようなcsvファイルがあったとします。 ab1,ef2,ab3,af4,ab5 bb1,bf2,bb3,bf4 cb1,cf2,cb3,cf4,cb5 zb1,zf2,zb3,zf4,zb5 プログラムに"cb3"という文字列を探させて、その文字列を含む一行 "cb1,cf2,cb3,cf4,cb5"のみを読み込む方法を探しております。 現時点では以下のコードにてcsvファイルを丸々読み込んでおります。 private void LoadData()//csvファイルを読み込む { string path = "abc.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 = CsvToArrayList1(strLine)[0]; abc.abctable.AddabctableRow ( strData[0], int.Parse(strData[1]) ); } sr.Close(); } c言語の時はstrstrで特定の文字を含む1行のみを取得できたのですが、 c#ではもっと良い方法があるのではと考えております、 お時間がありましたら是非教えてください。 皆様の丁寧な回答にいつも感謝しております。

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

  • ベストアンサー
回答No.1

http://homepage3.nifty.com/midori_no_bike/CS/ 今回の件では必要ないかもしれませんが、C#では正規表現で検索できるのが興味深いと思います。

master817199
質問者

お礼

凄い情報量のページですね、 勉強になります!ありがとうございます。

関連するQ&A

  • 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(); } } いつも丁寧な回答で協力してくれる皆様には心から感謝しております。 どうぞよろしくお願いします。

  • c#でボタンのアクションが終わった後に再度同じ動作をさせるには?

    アプリ上のボタンを押すと以下のLoadData()が実行され、 データセットにcsvファイルの情報が代入されるのですが、 一度実行されるとソフトを再起動しないと、ボタンを押しても再度同じ動作をしてくれません。 今回の場合、フォームに入力された数値が変数expに代入され、 代入された数値をcsv内で検索し、ヒットすればその行だけ読み込むというプログラムですので、一度実行されても再度別の数値で同じ動作を繰り返し行いたいのです。 初歩的な事かと思いますが、どうすれば再起動しなくても同じ動作を繰り返すようになるのか教えてください、よろしくお願いします。 public void LoadData() { string path = @"C:\Documents and Settings\PC USER\デスクトップ\222.csv"; string strLine;//1行分のデータ int p; string exp;//この文字を含む行のみを読み込む exp = textBox1.Text; 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(); p = strLine.IndexOf(exp);//指定文字が変数内にあるかどうかチェック if (p > 0) { strData = CsvToArrayList1(strLine)[0]; Dbuse.Dbusetable.AddDbusetableRow ( strData[0], int.Parse(strData[1]), strData[2], strData[3], strData[4] ); } else { } } sr.Close(); }

  • 特定の文字列をcsvから探して、その文字列を含む行を読み込むには?

    例えば以下のようなcsvファイルがあったとします。 ab1,ef2,ab3,af4,ab5 bb1,bf2,bb3,bf4 cb1,cf2,cb3,cf4,cb5 zb1,zf2,zb3,zf4,zb5 プログラムに"cb3"という文字列を探させて、その文字列を含む一行 "cb1,cf2,cb3,cf4,cb5"のみを読み込む方法を探しております。 何か良い方法がございましたら教えていただけませんでしょうか? よろしくお願いします。

  • 【VC++2005(CLR)】読み込んだcsvファイルの一部を書き換えたい

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++2005 Express Edition CLRでプロジェクトを作成しています。 表題の件なのですが、今まで以下のようにコーディングしていましたが、 読み取りはできるものの、書き込みができません。 何か良い方法はありませんでしょうか。 希望としては、ファイルの一箇所のみを書き換えたいので、 書き込み専用のファイルを用意して、読み込みファイルを 一行、一行コピーしたくないです。   すみませんが、よろしくお願い致します。 ***(表示を考慮するため、行の先頭に全角スペースを入れています。)*** String^ strDelimiter = ","; //","で分割する array<Char>^ delimiter = strDelimiter->ToCharArray(); array<String^>^ strData; //分割後の文字の入れ物 String^ strLine; //1行分のデータ System::IO::FileStream^ fs = gcnew System::IO::FileStream  (path, System::IO::FileMode::Open, System::IO::FileAccess::ReadWrite, System::IO::FileShare::ReadWrite); System::IO::StreamReader^ sr =   gcnew System::IO::StreamReader(fs,System::Text::Encoding::Default);  while(sr->Peek() >= 0){ //csvデータ分繰り返し   strLine = sr->ReadLine(); //1行読み込み   strData = strLine->Split(delimiter); //「,」で区切って、配列に分解   if (iWorkNum == int::Parse(strData[0])){    strData[2] = strWorkTime;//書き換えたい箇所はここだけ    //※ここからの処理方法を教えて下さい。   }  } } sr->Close(); fs->Close();  

  • [VC#2005] プログラムからのメニューの追加について

    Visual C#2005でウェブブラウザを作成していますが、IEの「お気に入り」のようなメニューを作成したいです。 リストデータから、ファイルを読み込み、項目を追加するまではできましたが、 リスト(CSVファイル)は下記のようになっており Yahoo,http://www.yahoo.co.jp/ goo,http://www.goo.ne.jp/ goole,http://www.google.co.jp/ これらを、メニューに追加します。 しかし、読み込みは完了しているようですが、 項目をクリックすると、一番最後の項目が実行されてしまいます。 (googleが表示されてしまいます) なぜでしょうか? いろいろと調べてみたのですが、「VC++」のものしかありません。 ソースはマイクロソフトのものを参考にしました。 private void LoadData() { string path = "urllist.txt"; string delimstr = ","; char[] delimiter = delimstr.ToCharArray(); string[] strData; string strLine; ToolStripMenuItem fileitem = new ToolStripMenuItem(); fileitem.Text = "お気に入り(&F)"; Boolean fileExsits = System.IO.File.Exists(path); if (fileExsits) { System.IO.StreamReader sr = new System.IO.StreamReader( path, System.Text.Encoding.Default); while (sr.Peek() >= 0) { strLine = sr.ReadLine(); strData = strLine.Split(delimiter); // Menustrip ToolStripMenuItem newitem = new ToolStripMenuItem(); newitem.Text = strData[0]; newitem.Click += delegate { webBrowser1.Navigate(strData[1]); }; fileitem.DropDownItems.Add(newitem); menuStrip1.Items.Add(fileitem); } } } ご指導をお願いします。

  • C#におけるファイル読み取りの文字化け

    開発初心者です。 //Shift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader(@txtShiteiFile.Text, System.Text.Encoding.GetEncoding(932)); //内容を全て読み込む string textAll = sr.ReadToEnd(); 以上の関数を使ってテキストファイル上の文字を読み取りしているのですが、 textAll 変数に入ったときに文字化けしています。 また、テキストファイルによっては文字化けしないときもあります。 この場合、どのような対処をすればよいのでしょうか?

  • C#でボタンのテキストに全角文字を表示する方法。

    N88-BASIC以来、プログラムには触れてなかったのですが、 かゆいところに手が届くソフトが欲しくてC#などに手を出してしまいました(^^;) はっきり言って基本がほとんど分かってない 初心者ですがよろしくお願いしますm(_ _)m 試行錯誤の上、CSVファイルから、2次元配列に読み込み、 ボタンやラベルのテキストに表示するところまではできたのですが、 CSVファイル内の全角文字が表示されません。 半角文字は問題なく表示されるのですが。。。 ご教授お願いいたしますm(_ _)m。 string[,] us1a; string tb1inf1; public void setting1_Click(object sender,System.EventArgs e) { Directory.SetCurrentDirectory(currentFolder); Directory.SetCurrentDirectory("usersetup"); const string filename1 = "us1.csv"; StreamReader sr; sr = File.OpenText(filename1); int us1y=0; us1a = new string [8,2]; while (sr.Peek() !=-1) { int us1x; string[] stringBuffer; string[] a; StreamReader reader = new StreamReader(filename1, System.Text.Encoding.GetEncoding("Shift-JIS")); stringBuffer = sr.ReadLine().Split(','); a = stringBuffer; for (us1x = 0 ; us1x < 2 ; us1x++) { us1a[us1y,us1x]=stringBuffer[us1x]; } us1y = us1y+1; } sr.Close(); tb1inf1 = us1a[0,0]; tn1.Text = tb1inf1; }

  • 【C#】StreamReaderクラスのエンコード

    こんばんは。 .NetFramework1.1のStreamReaderクラスを使用して、csvファイルを読み込んでいるのですが、 エンコードでShift_JISを指定しても、"€"などの環境依存文字がそのまま取得されてしまいます。 Shift_JISに存在しない文字は文字化けして取得されるものだと思っていましたが、違うのでしょうか? DBの文字コードがShift_JISなのでこのままDBへ渡すとエラーになってしまい困っています。 ご教授下さい。宜しくお願いします。 -- ソース ---------------------------------------------- StreamReader sr = new StreamReader(path,Encoding.GetEncoding("Shift_JIS")); string str = sr.ReadLine();

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

  • 1行ごとに取得して、その改行文字が何か知る方法

    CR,LF,CRLFが混在しているテキストで難儀しております。 VB.NETでReadLine()を使えば、どんな改行コードでも削除した文字列を取得できますが、同じ内容を書き込む場合にどのような改行コードわからないと同じファイルができません。 安直にNewLineやWriteLine()を使うと、どんな改行コードでWindowsの場合はCRLFになります。 ReadLine()で取得した文字列+改行コードがわかる方法がありますか? 以下、例です。 dim s as String Dim sr As New System.IO.StreamReader("yomu", "ISO-2022-JP") Dim sw As New System.IO.StreamWriter("kaku", false, "ISO-2022-JP") While sr.Peek() > -1 s = sr.ReadLine() '改行文字を取り除いた文字列 sw.Write(s) '書き込む end While sr.close() sw.close()

専門家に質問してみよう