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

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

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

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

C#

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1039閲覧

csvファイルを読み込み二次元配列に格納したい

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

C#

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/03/21 06:52

前提・実現したいこと

約1500行で10列に、スペース区切りで値が並んでいるcsvファイルがあります。
以下のコードで二次元配列に格納したつもりなのですが、新たなファイルに、
書き出したときに、「インデックスが配列の境界外です」というエラーが出ています。

配列の1次元の長さを取得して、for文で回していますが、なぜかうまくいきません。
初心者ですが、どなたかご教授よろしくお願い申し上げます。

発生している問題・エラーメッセージ

「インデックスが配列の境界外です」

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.IO; 4using System.Linq; 5using System.Text; 6 7public class ReadCSV 8{ 9 public static string[][] ReadingCsv(string file) 10 { 11 List<string[]> ReadCsvList = new List<string[]>(); 12 StreamReader ReadCsvObject = new StreamReader(file, Encoding.UTF8); 13 ReadCsvObject.ReadLine(); //ヘッダ読み飛ばし 14 while (!ReadCsvObject.EndOfStream) 15 { 16 string[] Data = ReadCsvObject.ReadLine().Trim(' ').Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray(); 17 ReadCsvList.Add(Data); 18 } 19 return ReadCsvList.ToArray(); 20 } 21} 22public class WriteCSV 23{ 24 private static string[] Depth; 25 26 public static void Main() 27 { 28 29 string[] files = Directory.GetFiles(Path, "*.csv"); 30 31 Depth = new string[ReadCSV.ReadingCsv(files[0]).GetLength(0)]; 32 33 for (int i = 0; i < ReadCSV.ReadingCsv(files[0]).GetLength(0) ; i++) 34 { 35 Depth[i] = ReadCSV.ReadingCsv(files[0])[i][0]; 36 } 37 38 Console.WriteLine("{0}",Depth[0]); 39 40 try 41 { 42 // appendをtrueにすると,既存のファイルに追記 43 // falseにすると,ファイルを新規作成する 44 bool append = false; 45 // 出力用のファイルを開く 46 StreamWriter WriteCsvObject = new StreamWriter(Path, append); 47 for (int i = 0; i < ReadCSV.ReadingCsv(files[0]).GetLength(0); i++) 48 { 49 WriteCsvObject.WriteLine("{0}", Depth[i]); 50 } 51 } 52 catch (System.Exception e) 53 { 54 // ファイルを開くのに失敗したときエラーメッセージを表示 55 Console.WriteLine(e.Message); 56 } 57 } 58 59 60}

試したこと

補足情報(FW/ツールのバージョンなど)

Visual Studio 2017

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

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

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

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

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

guest

回答1

0

ベストアンサー

空要素を削除しているので数が合わなくなったんじゃないでしょうか。

投稿2018/03/21 07:09

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2018/03/22 04:17

StringSplitOptions.RemoveEmptyEntriesのことでしょうか?
Zuishin

2018/03/22 04:19

少なくともそれと Trim(' ') です。
退会済みユーザー

退会済みユーザー

2018/03/22 04:32

コードからStringSplitOptions.RemoveEmptyEntriesとTrim(' ')を除いてみましたが、同じエラーメッセージが出てしまいました。
Zuishin

2018/03/22 04:38

「少なくとも」と書いたのはそれに加えて他にも原因があるかもしれないという意味です。 例えば探しているディレクトリにファイルが無ければ files[0] は例外を発生させます。 このように決め打ちしているところを直してみてください。
退会済みユーザー

退会済みユーザー

2018/03/22 04:41

わかりました。もう少しコードのどこがおかしいか精査してみたいと思います。
Zuishin

2018/03/22 04:49

もし自作でなくても構わないのなら CsvHelper というライブラリがあります。 Unity なら知りませんが、Visual Studio なら NuGet でプロジェクトに追加できますので、ツール→NuGet パッケージマネージャー→ソリューションの NuGet パッケージの管理で CsvHelper を検索して追加してください。 すでに多くの人の目に晒されているので安心して使うことができます。
退会済みユーザー

退会済みユーザー

2018/03/22 04:56

そのようなライブラリがあることは知りませんでした。 使ってみようと思います。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問