🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

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

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

4回答

9364閲覧

csvファイルの中身をList配列に格納したい

y.u

総合スコア8

CSV

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

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/11/01 06:32

編集2019/11/01 06:59

csvの中身をListに格納したいのですが結果が歯抜けのような感じになってしまっていて困っています。

csvの中身の例
01,山田
02,田中
03,佐藤
04,高橋
05,武田
06,山本
07,山口
08,井上
09,井口
10,上田
11,江藤
12,岡田
13,加藤

とあったときに
デバッグでstrCsvListの中身を確認すると
[0]02,田中
[1]03,佐藤
[2]05,武田
[3]06,山本
[4]08,井上
[5]09,井口
[6]11,江藤
[7]12,岡田
[8]null
[9]null

要素数13をそのまま格納したいのですがと01/04/07/10が飛んでしまった上に後ろ二つがnullになっている状態です
strCsvList.Add(sr.ReadLine());

strCsvList.Add(list);
に変えると
[0]01
[1]山田
[2]02
[3]田中



[25]加藤
になります。

[0]01 山田(配列)
[1]02 田中



という形にしたいのですがどうしたらよいでしょうか?

使用環境
visualstudio2019 
WindowsForms
.NET framework4.7.2

C

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.IO; 11 12namespace 読み込みテスト 13{ 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 private void Button1_Click(object sender, EventArgs e) 22 { 23       List<string> strCsvList = new List<string>(); 24 25 26 try 27 { 28 //読み込むcsvファイルのパスを指定して開く 29 using (StreamReader sr = new StreamReader(@"ファイルパス\ファイル名.csv", Encoding.GetEncoding("Shift_JIS"))) 30 { 31 while (sr.EndOfStream == false) 32 { 33 34 //1行づつ読み取る。 35 string line = sr.ReadLine(); 36 //カンマで区切る 37 string[] values = line.Split(','); 38 foreach (var list in values) 39 { 40 strCsvList.Add(sr.ReadLine()); 41 } 42 43 44 } 45 46 47 } 48 catch 49 { 50 MessageBox.Show("エラー"); 51 } 52 53 } 54 } 55}

イメージ説明

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

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

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

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

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

dodox86

2019/11/01 06:39

> 01/04/07/10が飛んでしまった とありますが、そのCSVファイルの提示が無いと原因の追究も回答もできないと思います。質問に追記するかたちで提示してください。
退会済みユーザー

退会済みユーザー

2019/11/01 10:29

> [0]01 山田(配列) > [1]02 田中 > ・ > ・ > ・ > という形にしたいのですがどうしたらよいでしょうか? 何だか分かりませんが想像を膨らませると、List<List<string>> 型のオブジェクトで、中身の List<string> が "01", "山田" というようにしたいということですか?
guest

回答4

0

ベストアンサー

C#

1//1行づつ読み取る。 2string line = sr.ReadLine(); //ここ1 3//カンマで区切る 4string[] values = line.Split(','); 5foreach (var list in values) 6{ 7 strCsvList.Add(sr.ReadLine());    //ここ2 8} 9

コメントのここ1とここ2で2回読み込んでいるから

というか、最終的にどのような状態にしたいのですか?
Listのひとつの要素を「01,山田」としたいのであれば、カンマで分割する必要はないのではないですか?

投稿2019/11/01 06:39

YAmaGNZ

総合スコア10469

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

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

y.u

2019/11/01 06:45

最終的には [0]01 山田 [1]02 田中 ・ ・ ・ という配列の形にしたいです。いろいろ稚拙ですみません
YAmaGNZ

2019/11/01 07:07

List<string[]>にするにしろList<List<string>>にするにしろ、提示されている単純なCSVであれば。valuesをListに入れるような形にすればいいかと思います。 valuesをそのままAddする。values.ToList<string>()をAddする等
papinianus

2019/11/01 11:02

私はぱっと見で、混乱したので補足させてください。 この構造のデータだとvaluesのLengthは必ず2なので、ここ2、では2回読み込みがおき、結果として、一行処理していると思っておられるwhileのループ一回で3行分処理してあることになります。
guest

0

csharp

1//using System.IO; 2//using System.Linq; 3//using System.Collections.Generic; 4 5public static IEnumerable<IEnumerable<string>> Parse(string path) => File.ReadLines(path).Select(l => l.Split(','));

投稿2019/11/01 12:47

papinianus

総合スコア12705

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

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

0

while()ループの中にコメントを入れて見ました。

C#

1while (sr.EndOfStream == false) { 2 //1行づつ読み取る。 3 string line = sr.ReadLine(); // 行を読み込む 4 //カンマで区切る 5 string[] values = line.Split(','); // 読み込んだ行をカンマで区切る --> values.Length = 2 6 foreach (var list in values) { // values の数だけ繰返す ==> 2回実行 7 strCsvList.Add(sr.ReadLine()); // foreach()は2回回るので、次の2行を strCsvList にAddする。 8 // 最初に読んだ行は、ループの回数に使用するだけで捨てられる。 9 } 10}

こんな感じなんでしょうか。

投稿2019/11/01 11:52

pepperleaf

総合スコア6385

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

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

0

そのCSVファイルの内容がそうなっているんでしょう。
表示されない不要な文字が入ってませんか?

投稿2019/11/01 06:37

y_waiwai

総合スコア88038

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

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

Zuishin

2019/11/01 06:40

ReadLine が何度呼ばれているか見てください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問