質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

619閲覧

C#で、"CSVファイルよりデータを文字列配列に取り込むソース"を作成したい

poy327

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/11/16 05:23

タイトル通り、"C#で、"CSVファイルよりデータを文字列配列に取り込むソース"を作成したいです。

色々と参考にしながら、よく見たことのあるソースを作成しました。

しかし素朴な疑問なのですが、下記のソースの場合、例えば"Item.csv"、"Chart.csv"という2つのcsvファイルがあった場合、2つともちゃんと読み込んでくれるのでしょうか?

ファイル名を指定していないため、この2つのcsvファイルをどのようにして特定し、読み込んでくれるか不安になりました。

自分で確かめれば良いことなのですが、とある事情で3日ほどvisual studioが使用できないのですが、もやもやするためご教授願います。

C#

1 private void BtnSplit_Click(object sender, EventArgs e) 2 { 3 List<string[]> sStrList = new List<string[]>(); // CSV分割後格納リスト 4 5 string sCsvPath = null; 6 if (CsvSplit(sCsvPath, ',', ref sStrList) == false) 7 { 8 9 return; 10 } 11 12 sStrList.ForEach(sList => 13 { 14 Debug.WriteLine(sList); 15 }); 16 } 17 18 19 20 21 22 23 public bool CsvSplit(string sCsvFilePath,char chDlimiter,ref List<string[]> sStrList) 24 { 25 bool bRet = true; 26 27 try 28 { 29 // CSVファイル読込 30 using (StreamReader objReader = new StreamReader(sCsvFilePath,Encoding.GetEncoding("shift_jis"))) 31 { 32 // ストリームの末尾まで繰り返す 33 while (objReader.EndOfStream != true) 34 { 35 // ファイルから一行読み込む 36 string sLine = objReader.ReadLine(); 37 38 // 読み込んだ一行を区切り文字で分けて配列に格納する 39 string[] sValues = sLine.Split(chDlimiter); 40 41 // 返却用リストに格納 42 sStrList.Add(sValues); 43 44 }//End while 45 } 46 } 47 catch (Exception e) 48 { 49 // ファイルを開くのに失敗したとき 50 Debug.WriteLine(e.Message); 51 52 bRet = false; 53 } 54 55 return bRet; 56 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/16 05:28

前のスレッド https://teratail.com/questions/158354 の続きですよね。前のスレッドでいろいろレスを貰っているのですから、まず前のスレッドでそれらにフィードバックを返せませんか? そして、方針変更して新たに別のスレッドを立てて質問するということを書いていただければと思います。
papinianus

2018/11/16 05:54

SurferOnWww様と指摘が似ているのですが、前回は、配列の配列(ジャグ配列)のはずでしたよね?仕様変更なんですか?手前味噌みたいになって嫌なんですが、前回の質問で私の書いたのは今回のコード程度のゆるいcsvなら対応していますし、List<string[]>にも容易に対応できるんですが?というかIEnumerable<IEnumerable<string>>でもいいってことですか?
guest

回答3

0

  • BtnSplit_Click

string sCsvPath = null;string sCsvPath = "Item.csv";という風に指定すればいいですし、FileDialogで選択させればいい。

後から、思ったのですが、2つのファイルを比較とか連結とかしたいということですかね?
書かれたコードはrefで引数を渡してaddしているからsCsvPathをかえて2回CsvSplitを呼び出せば、連結させることはできると思います。
比較するとか、結合(RDBのjoin)がやりたいなら、2つ変数を宣言して、LINQでやれば容易にできると思います(IntesectとかExceptとかJoinとかで)。

  • C#について

なんども言いますが、C++のことは忘れてください
システムハンガリアンで書かないでください(visual studioを使っているのですよね?)
このパターンでCsvSplitに成功したかどうかをboolで返す必要はないはずです。長さ0のListを返せばよいでしょう。

↓こう書いてますが、sListはsつまりstringではなく、string[]なので、要素の出力はできません。string.Join(",", sList)とかにしなければ。

csharp

1 sStrList.ForEach(sList => 2 { 3 Debug.WriteLine(sList); 4 });

投稿2018/11/16 05:47

編集2018/11/16 06:25
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

うーん、聞きたいことが分からない…

しかし素朴な疑問なのですが、下記のソースの場合、例えば"Item.csv"、"Chart.csv"という2つのcsvファイルがあった場合、2つともちゃんと読み込んでくれるのでしょうか?

読み込みたいファイルをちゃんと指定すればそりゃ読み込めます。
読み込みたいファイルが存在するディレクトリを指定してその中にある.csvファイルだけを読み込むように実装すればそりゃ読み込めます。

ファイル名を指定していないため、この2つのcsvファイルをどのようにして特定し、読み込んでくれるか不安になりました。

ファイル名を指定(正確にはファイルのフルパスかな)すれば読み込めますが、それを指定しなければ当然読み込まれもしません。

ちなみにサンプルコードをそのまま実行したらヌルリで落ちるんじゃないですかね。

投稿2018/11/16 05:34

ShikaTech

総合スコア468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/11/16 05:41

catch してるので落ちはしませんがまともに動きそうもないですね。 あと書き方が古すぎて 20 年前のソースかと思いました。
guest

0

ファイルの読み込みに関しては、既出の回答を読んで下さい。
下記はそれ以外に関してです。

例えば、csvファイルのある行に、
a,b,c,"d,e",f
とあるとします。
普通、この場合この行は5列として扱われますが、現在のコードでは、
6列となります。
ダブルクオーテーションのチェックをしましょう。

あと、CSVファイルを読み込むだけなら、わざわざコードを書かなくても
Microsoft.VisualBasic.FileIO.TextFieldParserを使えば良いと思います。
参考サイト

投稿2018/11/16 08:06

otftrough

総合スコア476

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問