今回のテーマ
こんにちは、サルモリです。
今回はCSVファイルを2つ読み込んで、比較するプログラムを作ってみましょう。
Linqの使い方と読み込み方法の記事を読んでいれば簡単に出来ますよ!
比較するファイル
パスは「D:\csvtest」に「比較ファイル1.csv」と「比較ファイル2.csv」を置きました。
各ファイルの中身はこのようになっています。
比較ファイル1.csv 図鑑番号,ポケモン名,タイプ1,タイプ2,HP,こうげき,ぼうぎょ,とくこう,とくぼう,すばやさ 1,フシギダネ,くさ,どく,45,49,49,65,65,45 2,フシギソウ,くさ,どく,60,62,63,80,80,60 3,フシギバナ,くさ,どく,80,82,83,100,100,80 4,ヒトカゲ,ほのお,NULL,39,52,43,60,50,65 5,リザード,ほのお,NULL,58,64,58,80,65,80 6,リザードン,ほのお,ひこう,78,84,78,109,85,100 7,ゼニガメ,みず,NULL,44,48,65,50,64,43 8,カメール,みず,NULL,59,63,80,65,80,58 9,カメックス,みず,NULL,79,83,100,85,105,78
比較ファイル2.csv 図鑑番号,ポケモン名,タイプ1,タイプ2,HP,こうげき,ぼうぎょ,とくこう,とくぼう,すばやさ 1,フシギダネ,くさ,どく,45,49,49,65,65,45 2,フシギソウ,くさ,どく,60,62,63,80,80,60 3,フシギバナ,くさ,どく,80,82,82,100,100,80 4,ヒトカゲ,ほのお,NULL,39,52,43,60,50,65 5,リザード,ほのお,NULL,58,64,58,80,65,80 6,リザードン,ほのお,ひこう,78,84,78,109,85,100 7,ゼニガメ,みず,NULL,44,48,65,50,64,43 8,カメール,みず,NULL,59,63,80,65,80,58 9,カメックス,みず,あく,79,83,100,85,105,78
カメックスがあくタイプでないのは分かると思いますが、
フシギバナの防御種族値はかなりのポケモンガチ勢じゃないと分からないと思います。
余談はここまでで、今回のプログラムでは、フシギバナの行とカメックスの行が出力されるのを目的とします。
今回作成したプログラム
早速作成したソースコードをみてみましょう!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.IO; using System.Linq; class Program { static void Main(string[] args) { var filepath1 = @"D:\csvtest\比較ファイル1.csv"; var filepath2 = @"D:\csvtest\比較ファイル2.csv"; var lines = File.ReadLines(filepath1); var lines2 = File.ReadLines(filepath2); var lineslist = lines.Select(n => n.Split(',')).ToList(); var lineslist2 = lines2.Select(n => n.Split(',')).ToList(); for(var i = 0;i < lineslist.Count;i++) { if (!lineslist[i].SequenceEqual(lineslist2[i])){ Console.WriteLine(lineslist[i].Aggregate((a,b) => a + "," + b)); } } } } |
出力結果
3,フシギバナ,くさ,どく,80,82,83,100,100,80
9,カメックス,みず,NULL,79,83,100,85,105,78
異なる値がある行のみ出力ができています!!
プログラムの解説
上記のプログラムの重要な部分を解説します。
step
1読み込む箇所
1 2 |
var lines = File.ReadLines(filepath1); var lines2 = File.ReadLines(filepath2); |
ファイルの読み込み方はReadStreamを使った方法など色々ありますが、
私はReadLinesメソッドを使用して読み込むのが一番好きです。
読み込んだデータをIEnumerable<T>型で返してくれるので、そのままLinqを使用できるんですよね!
それぞれ読み込んだデータをIEnumerable<T>型で持っています。
ファイルの読み込み方法は下記の記事にまとめています。
こちらもCHECK
-
C# ファイルの読み込み方法を3つ紹介します。読み込み方法で一番良いのはReadLinesメソッドの理由
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
step
2データの整形とリスト化
データの整形とリスト化をしています。今回の目的としてはSplitメソッドで分割しなくても良いのですが、
分割して配列にしてしまった方が後々使いやすいので、配列にしています。
1 2 |
var lineslist = lines.Select(n => n.Split(',')).ToList(); var lineslist2 = lines2.Select(n => n.Split(',')).ToList(); |
この処理でリストには下記のようにデータが入っています。
型 | 配列0番目 | 配列1番目 | 配列2番目 | 配列3番目 |
string[] | 1 | フシギダネ | くさ | どく |
string[] | 2 | フシギソウ | くさ | どく |
string[] | 3 | フシギバナ | くさ | どく |
string[] | 4 | ヒトカゲ | ほのお | NULL |
string[] | 5 | リザード | ほのお | NULL |
string[] | 6 | リザードン | ほのお | ひこう |
step
32つのデータの比較と出力
最後に整形したデータ同士で比較を行っています。for文でリストの行を1つずつ見ています。
LinqのSequenceEqualメソッドを使用すると、各配列の中身がそれぞれ一致しているか確認してくれます。
比較をして値が違う行のみ各データを結合して、出力しています。
1 2 3 4 5 6 |
for(var i = 0;i < lineslist.Count;i++) { if (!lineslist[i].SequenceEqual(lineslist2[i])){ Console.WriteLine(lineslist[i].Aggregate((a,b) => a + "," + b)); } } |
SequenceEqualメソッドについてはこちら
こちらもCHECK
-
【C# sharp Linq】Count、SequenceEqual、FirstOrDefault、LastOrDefaultメソッドを解説します。
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
まとめ
今回は2つのCSVファイルを読み込んで、比較を行うプログラムを紹介しました。
ココがポイント
Csvファイルの各データを配列にしておくことで、柔軟に対応できるようになるのでオススメです。
今回は行の比較をするプログラムでしたが、配列に整形しておくことで各要素で比較することも可能です!!
それでは、最後まで読んで頂き、ありがとうございました。お役に立てていれば光栄です!!
ファイルについての記事はこちら