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

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

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

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

C#

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

解決済

2回答

1699閲覧

csvの要素とリストを比較したい

mori_1228

総合スコア8

CSV

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

C#

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

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

1グッド

1クリップ

投稿2020/01/15 13:59

編集2020/01/15 14:19

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using static System.Console; 5using System.IO; 6using System.Text.RegularExpressions; 7 8namespace Taglist 9{ 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); 15 16 try 17 { 18 // csvファイルを開く 19 using (var sr = new System.IO.StreamReader(@"D:tagList.csv", System.Text.Encoding.GetEncoding("shift-jis"))) 20 { 21 //配列をリストに変換 22 List<string> stringList = new List<string>(); 23 24 //csvの最大行取得 25 string[] lines = File.ReadAllLines(@"D:tagList.csv"); 26 27 28 for (int i = 0; i < lines.Length; i++) 29 { 30 // ファイルから一行読み込む 31 var line = sr.ReadLine(); 32 33 // 読み込んだ一行をカンマ毎に分けて配列に格納する 34 var tagget = line.Split(','); 35 36 //tagget[3]を/毎に分けて配列に格納 37 var tagget2 = tagget[3].Split('/'); 38 39 //複数の要素をlistにまとめて追加 40 stringList.AddRange(tagget2); 41 42 } 43 44 //重複した要素を削除 45 IEnumerable<string> result = stringList.Distinct().Take(19); 46 Console.WriteLine("[{0}]", string.Join(", ", result)); 47 } 48 } 49 catch (System.Exception e) 50 { 51 // ファイルを開くのに失敗したとき 52 System.Console.WriteLine(e.Message); 53 } 54 } 55 } 56} 57

taglist.csvの先頭3行抜粋

SLAM DUNK(スラム ダンク) (漫画),あらすじなので省略,日本 開始日:1990 週刊少年ジャンプ 1990年42号 / 終了日:1996 1996年27号,熱血/感動/格好良い/面白い/友情 今日から俺は!! (漫画),著者:西森博之 出版社:小学館,日本 開始日:1988 / 終了日:1997[開始日詳細] 週刊少年サンデー増刊号1988年9月号?1990年8月号 週刊少年サンデー1990年40号?1997年47号 ,面白い/友情/格好良い/楽しい/可笑しく笑える ドラゴンボール(DRAGON BALL) (漫画),著者:鳥山明 出版社:集英社 単行本:全42巻(ジャンプコミックス)、全34巻(完全版),日本 開始日:1984 週刊少年ジャンプ 1984年51号 / 終了日:1995 1995年25号,面白い/格好良い/熱血/楽しい/友情               ・               ・               ・

taglist.csvの[3]の先頭5行抜粋

熱血/感動/格好良い/面白い/友情 面白い/友情/格好良い/楽しい/可笑しく笑える 面白い/格好良い/熱血/楽しい/友情 考えさせられた/面白い/感動/格好良い/熱血 面白い/可笑しく笑える/楽しい/格好良い/感動

上記のコードは8000行あるtagList.csvの要素3を抽出し、抽出したものをバラバラに分解して重複するものを削除し、一つのリストにまとめるコードになります。
一つのリストにまとめた結果下記のような結果を得られました。
[熱血, 感動, 格好良い, 面白い, 友情, 楽しい, 可笑しく笑える, 考えさせられた, 怖い, 涙流した, びっくり, 勉強になった, 可愛い, 悲しい, 美しい, ロマンチックな気分, 勇気貰った, セクシー, 道徳心&モラル]

今回はこの得られた結果をtaglist.csvの要素3と比較して、同じ要素があるときは1をないときは0を出力するプログラムを作りたいと考えております。
例としては1行目と比較するなら
熱血,感動,格好良い,面白い,友情,楽しい,可笑しく笑える
1,1,1,1,0,0,0,0・・・
といった感じになります。

一つ一つ要素を比較していこうと考えてるのですが、IEnumerable<string>型のresultではtagget2と比較するとエラーが出て比較できません。どのようにすると比較が上手くいくかご教授していただけると幸いです。

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じですかね?

cs

1using System; 2using System.Collections.Generic; 3using System.IO; 4using System.Linq; 5using System.Text; 6 7namespace Questions235381 8{ 9 class Program 10 { 11 static void Main() 12 { 13 var s = @"SLAM DUNK(スラム ダンク) (漫画),あらすじなので省略,日本 開始日:1990 週刊少年ジャンプ 1990年42号 / 終了日:1996 1996年27号,熱血/感動/格好良い/面白い/友情 14今日から俺は!! (漫画),著者:西森博之 出版社:小学館,日本 開始日:1988 / 終了日:1997[開始日詳細] 週刊少年サンデー増刊号1988年9月号?1990年8月号 週刊少年サンデー1990年40号?1997年47号 ,面白い/友情/格好良い/楽しい/可笑しく笑える 15ドラゴンボール(DRAGON BALL) (漫画),著者:鳥山明 出版社:集英社 単行本:全42巻(ジャンプコミックス)、全34巻(完全版),日本 開始日:1984 週刊少年ジャンプ 1984年51号 / 終了日:1995 1995年25号,面白い/格好良い/熱血/楽しい/友情"; 16 17 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 18 File.WriteAllText(@"test.csv", s, Encoding.GetEncoding("shift-jis")); 19 20 21 var stringSet = new HashSet<string>(); // 重複なし熱血集合 22 var stringList = new List<string[]>(); // 各行の熱血配列のリスト 23 24 var lines = File.ReadAllLines(@"test.csv", Encoding.GetEncoding("shift-jis")); 25 foreach(var line in lines) 26 { 27 var tagget = line.Split(','); 28 var tagget2 = tagget[3].Split('/'); 29 stringSet.UnionWith(tagget2); 30 stringList.Add(tagget2); 31 } 32 33 var sb = new StringBuilder(); 34 sb.AppendLine(string.Join(",", stringSet)); 35 36 foreach(var n in stringList) 37 { 38 sb.AppendLine(string.Join(",", stringSet.Select(x => n.Contains(x) ? 1 : 0))); 39 } 40 41 Console.WriteLine(sb.ToString()); 42 } 43 } 44}

投稿2020/01/16 10:16

編集2023/07/18 21:08
TN8001

総合スコア9326

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

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

mori_1228

2020/01/16 14:48

分かりやすいコード説明ありがとうございました!無事出力出来ました!
guest

0

投稿2020/01/16 05:50

kiichi54321

総合スコア1984

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問