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

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

新規登録して質問してみよう
ただいま回答率
85.47%
C#

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

配列

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

Q&A

解決済

4回答

10840閲覧

c# 二次元配列をcsvに書き込みたい

nekohouse

総合スコア17

C#

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

配列

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

1グッド

0クリップ

投稿2020/02/13 03:31

二次元配列(行数、列数は可変で決まっていない)をcsvに書き込みたいのです。
値はカンマ区切りにしたいです。
仮に列数が3だと以下のコードになります。

public double[,] Values;//二次元配列、行数、列数は可変で決まっていない

using (var sw = new System.IO.StreamWriter(@"test.csv", false))
{
for (int i = 0; i < Values.GetLength(0); ++i)
{
sw.WriteLine("{0}, {1}, {2},", Values[i,0], Values[i,1], Values[i,2]);
}

これを列数を自由に変えれるようにしたいのですが何か方法はないでしょうか?
配列の配列に変更せずに変えたいです。
任意の行の配列を取り出せればstring.Joinでできると思うのですが…

kakka👍を押しています

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

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

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

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

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

Zuishin

2020/02/13 03:53

なぜ忌避しているのかわかりませんが、List<List<string>> が最善だと思います。
退会済みユーザー

退会済みユーザー

2020/02/13 05:10

初学者の方は配列しか思い浮かばない傾向があるようですが、そうなんですか? どうしても配列を使わなければならない事情があれば教えて下さい。特に事情がないということなら XY 問題になっていると思います。
nekohouse

2020/02/13 05:34

配列Valuesを用いたコードが大量にあるため変更したくありません Valuesの要素数は2億くらいあります ループでもなんでもよいので具体的なコードを例示して頂けると助かります。 最後の列数のあとにカンマをつけない様にする方法が思いつきません
Zuishin

2020/02/13 06:18

ああまた作業依頼か。
退会済みユーザー

退会済みユーザー

2020/02/13 06:56

配列を使うなら、YAmaGNZ さんから回答をもらっているのだからそれにきちんとフィードバックを返しましょう。すべての話はそれからです。
nekohouse

2020/02/13 08:22

ご指導ありがとうございました。
guest

回答4

0

ベストアンサー

ループで回せばいいのではないですか?

最後のカンマが邪魔なら
添え字0のものをループの外で入れて、ループで",データ"と追加していけばいい
もしくは、最後に消せばいい

投稿2020/02/13 03:42

編集2020/02/13 06:17
YAmaGNZ

総合スコア10266

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

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

nekohouse

2020/02/13 08:16

ループで1次元行列に再定義してstring.Joinを使用してみます。 ご回答大変ありがとうございました。
guest

0

データ多いようなのであまり変換しないほうがいいかもしれません。

C#

1 var data = Values.Cast<double>().ToArray(); 2 var count = Values.GetLength(1); 3 for (var i = 0; i < Values.Length; i += count) 4 { 5 var seg = new ArraySegment<double>(data, i, count); 6 sw.WriteLine(string.Join(", ", seg)); 7 }

投稿2020/02/13 08:22

x_x

総合スコア13749

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

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

nekohouse

2020/02/13 08:42

勉強になります。 ありがとうございます。
guest

0

任意の行の配列を取り出せればstring.Joinでできると思うのですが…

string.Joinしました(効率はわかりません)
c# - How to get a dimension (slice) from a multidimensional array - Stack Overflow の丸パクリです^^;

cs

1using System.Collections.Generic; 2using System.IO; 3 4namespace Questions241081 5{ 6 internal class Program 7 { 8 private static void Main() 9 { 10 double[,] Values = { { 1.1, 2.2 }, { 3.3, 4.4 } }; 11 12 using(var sw = new StreamWriter(@"test.csv", false)) 13 { 14 for(var i = 0; i < Values.GetLength(0); ++i) 15 { 16 sw.WriteLine(string.Join(", ", Values.SliceRow(i))); 17 } 18 } 19 } 20 } 21 22 // c# - How to get a dimension (slice) from a multidimensional array - Stack Overflow 23 // https://stackoverflow.com/questions/4801990/how-to-get-a-dimension-slice-from-a-multidimensional-array 24 internal static class ArrayExtensions 25 { 26 public static IEnumerable<T> SliceRow<T>(this T[,] array, int row) 27 { 28 for(var i = array.GetLowerBound(1); i <= array.GetUpperBound(1); i++) 29 { 30 yield return array[row, i]; 31 } 32 } 33 } 34}

投稿2020/02/13 09:42

編集2023/07/20 13:31
TN8001

総合スコア9326

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

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

nekohouse

2020/02/13 11:14

勉強になります。 ありがとうございます。
TN8001

2020/02/13 11:40

本題と関係ないコードのせいで伝わっていない気がするので、シンプルに書き直しました^^
guest

0

大変ベタベタな作りですが、これで多次元配列の行列可変でも出力できると思います。

C#

1using System.IO; 2using System.Text; 3 4namespace ArrayToCsv 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 double[,] Values = new double[,]{ {10, 20, 30}, {40, 50, 60}, {70, 80, 90} }; 11 using (StreamWriter writer = new StreamWriter(@"Output.csv", false)) { 12 for (int i = 0; i < Values.GetLength(0); i++) 13 { 14 StringBuilder sb = new StringBuilder(); 15 for (int j = 0; j < Values.Length / Values.GetLength(0); j++) 16 { 17 if (j > 0) 18 { 19 sb.Append(","); 20 } 21 sb.Append(Values[i,j]); 22 } 23 writer.WriteLine(sb); 24 } 25 } 26 } 27 } 28}

投稿2020/02/13 08:14

yureighost

総合スコア2183

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

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

nekohouse

2020/02/13 08:21

大変スマートですね! このやり方でやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問