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

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

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

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

Q&A

解決済

3回答

7877閲覧

[C#]datatableを結合し行を揃えてcsvファイルに出力したい

pn47

総合スコア10

C#

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

0グッド

0クリップ

投稿2017/06/06 23:13

編集2017/06/08 10:09

###前提・実現したいこと
実現したいことは、異なるCSVファイルをデータテーブルに読み込んで
一つのcsvファイルとして一行目に情報を出力することなのですが

dt.merge()を用いて結合すると行がずれてしまいます。
写真にあるようなdt2 row1,2をdt1 row1,2,3と同じ行に出力する方法がありましたら教えていただきたいです。
一つ目のcsvファイルは400行程度で2つ目のcsvファイルは655行となっています。

出力画面

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

エラーメッセージ ```なし ###該当のソースコード ```ここに言語を入力 ここにご自身が実行したソースコードを書いてください
DataTable dt1 = new DataTable(); DataTable dt2 = new DataTable(); DataTable dt3 = new DataTable(); dt1.Columns.Add("A", Type.GetType("System.String")); dt1.Columns.Add("B", Type.GetType("System.String")); dt1.Columns.Add("C", Type.GetType("System.String")); dt2.Columns.Add("D", Type.GetType("System.String")); dt2.Columns.Add("E", Type.GetType("System.String")); DataRow row = dt1.NewRow(); row[0] = "dt1 row1"; row[1] = "dt1 row2"; row[2] = "dt1 row3"; dt1.Rows.Add(row); DataRow row2 = dt2.NewRow(); row2[0] = "dt2 row1"; row2[1] = "dt2 row2"; dt2.Rows.Add(row2); dt3.Merge(dt1); dt3.Merge(dt2);

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/06/07 00:34 編集

やりたいことや質問の背景&全体のシナリオ・ストーリーをきちんと書いていただけませんか? スキーマが異なるテーブルをマージすることは普通はしないと思うのですが・・・ 全体的なやりたいことやストーリーのごく一部を切り出して質問すると、もしその質問が全体的なやりたいことを実現するのには見当違いだった場合、回答も当然やりたいことを実現するには的外れになってしまいます。そうすると、見当違いと的外れのやり取りが繰り返されるだけになって、なかなか解決にたどり着けません。時間の無駄でもありますし。
pn47

2017/06/07 09:52

失礼しました。質問内容を編集しましたが、不備がございましたらご指摘お願い致します。
退会済みユーザー

退会済みユーザー

2017/06/07 14:35

2 つの CSV にはそれぞれ一行しかないのですか? 違いますよね。多分複数行あるのではないかと思いますが。2 つの CSV の具体例を出せませんか?
pn47

2017/06/08 10:04

仕事のため返信が遅くなりました。一つ目のCSVが400行で2つ目のCSVは655行となっています。カンマ区切りで改行コードは使用していません。
退会済みユーザー

退会済みユーザー

2017/06/08 11:07

具体例を出してほしいとお願いしているのですが。ここに書いてあること以外は何も知り得ない第三者にどういう情報を提供すればあなたの問題を理解してもらえるか、よく考えてください。
退会済みユーザー

退会済みユーザー

2017/06/08 11:15

一度 https://teratail.com/help/question-tips を読んでいただければと思います。それに書いてありますが "人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです" が重要で、現状それが不十分だと思います。
guest

回答3

0

C#

1DataTable dt1 = new DataTable(); 2 3dt1.Columns.Add("A", Type.GetType("System.String")); 4dt1.Columns.Add("B", Type.GetType("System.String")); 5dt1.Columns.Add("C", Type.GetType("System.String")); 6dt1.Columns.Add("D", Type.GetType("System.String")); 7dt1.Columns.Add("E", Type.GetType("System.String")); 8 9DataRow row = dt1.NewRow(); 10row[0] = "dt1 row1"; 11row[1] = "dt1 row2"; 12row[2] = "dt1 row3"; 13row[3] = "dt1 row1"; 14row[4] = "dt1 row2"; 15 16dt1.Rows.Add(row);

投稿2017/06/07 11:03

編集2017/06/07 11:06
Zuishin

総合スコア28660

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

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

0

そもそも Merge メソッドを勘違いされているような気がします。
DataTable.Merge メソッド (DataTable)
あるDataTableに他のDataTableの行を追加するイメージではないでしょうか。

おそらくやりたいのはこんな感じのことでは?

C#

1dt3.Columns.Add("A", Type.GetType("System.String")); 2dt3.Columns.Add("B", Type.GetType("System.String")); 3dt3.Columns.Add("C", Type.GetType("System.String")); 4dt3.Columns.Add("D", Type.GetType("System.String")); 5dt3.Columns.Add("E", Type.GetType("System.String")); 6 7for (int i = 0; i < Math.Min(dt1.Rows.Count, dt2.Rows.Count) ; i++) 8{ 9 dt3.Rows.Add(dt1.Rows[i][0], dt1.Rows[i][1], dt1.Rows[i][2], dt2.Rows[i][0], dt2.Rows[i][1]); 10}

dt1dt2の行数が異なる場合はどうするのかが仕様的に気になりますが。

投稿2017/06/07 10:15

workaholist

総合スコア559

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

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

pn47

2017/06/08 10:12

回答ありがとうございます。 ご指摘の通りMergeメソッドを勘違いしていたようです。
guest

0

ベストアンサー

CSVを読み込んだ時に、それぞれ、1行ずつテキスト扱いにして、連結してから処理をすればよいのではないでしょうか?

//概念的な構造
CSV1{
CSV2{
l1 = stream.readline(csv1) +","+ stream.readline(csv2);
string[] ss = l1.split(',');
//文字列配列をテーブルに追加
}
}

投稿2017/06/08 05:24

107User

総合スコア78

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

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

退会済みユーザー

退会済みユーザー

2017/06/08 05:35

フィールドの中に改行コードやデリミタ(カンマ)が含まれているような場合どうするかという問題がありますね。なので、「2 つの CSV の具体例を出せませんか?」とお願いしたのですが・・・
107User

2017/06/08 06:13

改行コードは、リプレイスで解決できます。 カンマは、内容に””でくくられているか、チェックして処理を変えていくといったとこでしょうか 2つの行の連結条件も曖昧ですね。
退会済みユーザー

退会済みユーザー

2017/06/08 06:59

> 改行コードは、リプレイスで解決できます。 どういう意味でしょう? 107User さんの言われる stream.readline というのは、改行コード(\n, \r, \r\n)があるところまでを 1 レコード分の文字列としてとして取得する(StreamReader.ReadLine メソッドと同等)という意味だと理解していますが、そうであるとすると、例えば以下のような場合(AAA から最後の \r\n までが一つのレコード)はどうするのでしょう? AAA, "BBB\r\nBBB", "CCC,CCC", DDD\r\n
107User

2017/06/08 07:57

string stBuffer = cReader.ReadLine().Replace("\n\r",""); string stBuffer2 = cReader.ReadLine().Replace("\n\r", ""); string[] ss = stBuffer+ ","+ stBuffer.Split(','); これで改行までの処理は可能です
107User

2017/06/08 08:03

””の中にある,について List<string> output = new List<string>(); StringBuilder sb = new StringBuilder(); bool mode = false; foreach (string s in ss) { if (s.IndexOf('"')>0) { if (mode) { output.Add(","+sb.ToString()); sb.Length = 0; mode = false; }else { sb.Append(s); mode = true; } } else { if (mode) { sb.Append(s); }else { output.Add(sb.ToString()); } } } CSVの作成時にデーターに,が含まれないように規則を設けるれば、この処理はいらないでしょう。 システム全体の指針の検討も必要です。
退会済みユーザー

退会済みユーザー

2017/06/08 08:29

> これで改行までの処理は可能です コードは意味が分かりませんが、先のコメントで私が書いた以下の例はそのコードを適用するとどういう結果になるのでしょう? AAA, "BBB\r\nBBB", "CCC,CCC", DDD\r\n 上記は 1 つのレコードで、2 つ目のフィールドは BBB\r\nBBB、3 つ目のフィールドは CCC,CCC という文字列となっており、それをそのまま取得しないと NG なのですが。 また、レコードの終端を示す \r\n とフィールドの中にある \r\n が識別できませんよね? 例えば、以下のように 2 つのレコードがある場合はどうするのですか? AAA, "BBB\r\nBBB", "CCC,CCC", DDD\r\n EEE, FFF, HHH, III\r\n
Zuishin

2017/06/08 08:32

ReadLine は改行コードまでを読み、改行コードを削除します。従って、その方法では無理です。
107User

2017/06/08 09:41

>AAA, "BBB\r\nBBB", "CCC,CCC", DDD\r\n データーの中に改行が入っているデーターも許容するという事ですね。 この場合、あのままではZuishinさんが指摘のように対応できません。 その場合は、まず全データーを全部読み込んで、処理が必要になります。 データーが入れ子状態になっているので、処置が難しいですね。 頭から一つ一つチェックして、”の中にある場合とない場合で処理を変えてく方法が考えられ余す カンマが登場したら、出力 ただし”の中ならそのまま 改行が登場したら、出力 ただし”の中ならそのまま シーケンシャルな処理になりますね。
退会済みユーザー

退会済みユーザー

2017/06/08 10:16

以下の記事の最初の方だけでいいので一読してみることをお勧めします。 CSV形式のファイルをDataTableや配列等として取得する http://dobon.net/vb/dotnet/file/readcsvfile.html 「CSV形式とは?」の全部の可能性を考えた場合、ReadLine で切ってカンマで Split するというような単純な方法ではダメです。と言って、自力でそのルールに対応できるコードを書くのも難しいので、既存の CSV パーサーを使うことを検討した方がよさそうです。 今回の質問者さんのケースで、そこまで考える必要がないという場合は 107User さんの提案された方法でも可能かもしれませんが、質問者さんに「2 つの CSV の具体例を出せませんか?」という私のお願いに答えてもらわないと何とも言えません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問