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

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

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

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

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

2254閲覧

2つのエクセルファイルの特定の列から値を比較する方法を教えてください。

PotePui

総合スコア69

C#

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

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/11/15 11:45

表題の件ですが、
最終的な結果として以下になっていれば大丈夫です。

  1. test1.xlsx ⇒ DataTable1に格納
  2. test2.xlsx ⇒ DataTable2に格納

■前提
1,2のDataTableには同じカラムがあります。
異なるのは、行数です。

■やりたいこと
DataTable1にDataTable2で新しく追加された、ファイル名があれば、
それをDataTable1に記載する。
⇒要は、DataTable1に記載済みの行に、同じ値がなければ、
それは新しいファイル名とみなし、DataTable1の最終行の下に行を追加する。

※値を追加ではなく、行を追加でお願いします。

■試したこと
色々調べて、下記のようなコードで処理も早くできるみたいでした。
DataTable.Select("カラム名 = 値")

ただ色々調べていくうちにselectはやっぱり遅いみたいですね汗
LINQとかあまり詳しくないですが、
処理が早めなLINQを使わないのも教えていただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DataTable.Mergeってことですかね?

追記

とりあえず書いてみました。

C#

1 static void Main(string[] args) 2 { 3 DataTable tableA = new DataTable(); 4 DataTable tableB; 5 6 tableA.Columns.Add("ColumnA"); 7 tableA.Columns.Add("ColumnB"); 8 tableA.Columns.Add("ColumnC"); 9 tableA.Columns.Add("ColumnD"); 10 11 tableB = tableA.Clone(); 12 13 //TableAのデータ作成 14 tableA.Rows.Add(100, "AAA", "abc", 500); 15 tableA.Rows.Add(100, "AAA", "abc", 600); 16 tableA.Rows.Add(101, "BBB", "bbb", 200); 17 tableA.Rows.Add(102, "CCC", "ccc", 1000); 18 tableA.Rows.Add(106, "FFF", "fff", 400); 19 20 //TableBのデータ作成 21 tableB.Rows.Add(100, "AAA", "abc", 500); //同じレコード 22 tableB.Rows.Add(100, "AAA", "abc", 700); //一部のカラムの値が異なる 23 tableB.Rows.Add(105, "EEE", "eee", 2000); //全部違う 24 25 //LINQ 26 var rows = tableA.AsEnumerable().Union(tableB.AsEnumerable(), DataRowComparer<DataRow>.Default); 27 //DataRowの塊なので、とりあえずDataTableに入れる 28 DataTable tableC = tableA.Clone(); 29 foreach (DataRow r in rows) 30 { 31 tableC.ImportRow(r); 32 } 33 ViewTable(tableC); 34 35 Console.WriteLine('\n'); 36 37 //Selectで 38 tableA.CaseSensitive = true; 39 foreach (DataRow r in tableB.Rows) 40 { 41 string where = $"ColumnA = {r["ColumnA"]} AND ColumnB = '{r["ColumnB"]}' AND ColumnC = '{r["ColumnC"]}' AND ColumnD = {r["ColumnD"]}"; 42 43 if (tableA.Select(where).Length == 0) tableA.ImportRow(r); 44 } 45 ViewTable(tableA); 46 47 48 49 Console.ReadKey(); 50 } 51 52 static void ViewTable(DataTable t) 53 { 54 foreach (DataRow r in t.Rows) 55 { 56 foreach (Object item in r.ItemArray) 57 { 58 Console.Write(item.ToString() + '\t'); 59 } 60 Console.Write('\n'); 61 } 62 63 } 64

投稿2018/11/15 22:22

編集2018/11/17 13:01
YAmaGNZ

総合スコア10258

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

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

PotePui

2018/11/17 04:54

分かりづらくて、申し訳ございません。 簡単にいうと、 2つのエクセルがあり、そこの表を2つDatatable変数に格納。 その後、2つのエクセルには同じカラム名(Price)があるとして、 1つめのエクセル:表のカラム内の値 2つめのエクセル:表のカラム名の値 上記でいうと、1つ目が最初に作成されたDatatableだとして、 2つめのエクセルのPriceカラムの値には、1つ目の中に含まれているかを 確認するにはどうすればいいのかと思って聞きました。 自分のなかでは、 単純にifで比較してもダメなので、 2つを配列のString型等に値代入してから、比較しないとと思っています。 また、 Priceだけでなく、 先ほど気づきましたが、 1行すべてが、もう片方のDataTableの表の中の値と一致しているかいないかをチェックする必要がありそうです。 なので、 2つめのDatatableの1行目から最終行まで(もしく値)を変数に代入して、1つ目の1行目から最終行まで完全一致している行があるか調べたいです。 一致していなければ、それはその時にこちらでしたい処理があるので、 そこは大丈夫です。 以上になります。
YAmaGNZ

2018/11/17 08:51

最初の方の話では、それぞれのDataTableのカラムは DataTableA:Price、カラムA、カラムB DataTableB:カラムC、Price と別々のデータ構造を持っていると解釈したのですが、後半では 1行全てが一致しているか判断する 1行全てが一致となると、テーブル構造は同じだと思いますが、どうなんでしょう?
PotePui

2018/11/17 09:44

はい、 古いDBに更新された新しい行を追加していきたいと思っています。 最初は、ひとつのカラムだけを調べればよいと思っていましたが、 実際には他のカラムも調べていかないと、 完全一致しているかの確認はできないことがわかりましたので、 1行にいたしました。 もしくは、カラムは4つくらいしかないので、 And条件で加えればいいのかな?と思っています。 ご質問のテーブル構造は、 古いDBにそこに既にあるものであれば、古いDBには何も処理をしない。 古いDBにはない行(カラムの値どれか少しでも違う)な場合は、古いDBの最終行に 1行を追加して加えるという、更新作業を考えてます。 古いものはそのまま、DBに残して、 新しいものを古いDBに新しい行に追加していく、ということを実現させたいです。 ご連絡いただき、ありがとうございます。
YAmaGNZ

2018/11/17 09:48

えーと、結局テーブル構造は同じなんですかね?
PotePui

2018/11/17 10:42

はい、構造は同じです。すみません。
akirafudo6

2018/11/21 07:15

双方とも、ソートかけて、マッチングしたらどうですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問