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

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

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

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

C#

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

Q&A

解決済

3回答

9610閲覧

CSVファイルを読み込み、構造体(クラス)に格納したい

say5140

総合スコア12

CSV

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

C#

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

0グッド

0クリップ

投稿2017/03/05 10:56

編集2017/03/05 14:04

CSVファイルの内容を読み込み、構造体(クラス)格納するさせたいです。
参考書で以下のようなソースがあったのでコーディングしたのですが、コンパイルエラーとなります。

class Record
{
public string Name { get; set; }
public string Birth { get; set; }
public string sex { get; set; }
public string Age { get; set; }

public static IEnumerable<Record> ReadCsv(string path) { return ReadCsv(File.ReadLines(path)); //ここでエラー }

}

呼び出し側
var records = Record.ReadCsv(ファイル名);

エラーとなっているのは、ReadCsvの引数はstringのためなのは分かるのですが
この参考にしたサンプルが間違っているのか解決方法が分かりません。
ReadLinesの戻り値の型はIEnumerable<string>だと思うので、ReadCsvで正常に読み込んだとしても型があわないように思います。

何か大きな勘違いをしているような気もしますが、何卒よろしくお願いします。

開発環境は、Visual Studio 2015 Express、.Net Framework 4です。

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

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

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

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

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

seastar3

2017/03/05 12:48

4つの項目のstructを宣言するつもりでしょうが、4つ目のNqmeが1つ目と重なっています。AgeとかAdressとかでしょうか。
say5140

2017/03/05 14:05

seastar3さん、すみません誤記でしたので修正しました。型は全てstringです。
guest

回答3

0

オーバーロードされた ReadCsv があるんじゃないでしょうか?
あまりに不完全すぎてそりゃコンパイル通る訳がないと思うソースですが、これで全文ですか?

追記

要するにこれの一部じゃないかということです。

C#

1public Record(string line) 2{ 3 // TODO: 文字列を解析してプロパティ・フィールドに代入する処理 4} 5 6public static IEnumerable<Record> ReadCsv(string path) 7{ 8 return ReadCsv(File.ReadLines(path)); 9} 10 11public static IEnumerable<Record> ReadCsv(IEnumerable<string> lines) 12{ 13 return lines.Select(a => new Record(a)); 14}

投稿2017/03/05 22:00

編集2017/03/05 22:26
Zuishin

総合スコア28656

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

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

say5140

2017/03/05 22:50

ありがとうございます。 説明を見るとやはり参考書のコードは一部分だったのだと思います。 参考書だけでは理解が追いつきませんでしたが、この説明でなるほどと思いました。 もう一度トライしてみます。
guest

0

自己解決

以下のコード追加し、Recordコンストラクタで文字列を解析するようにして無事に解決しました。

public static IEnumerable<Record> ReadCsv(IEnumerable<string> lines)
{
return lines.Select(a => new Record(a));
}

アドバイス頂いた方、ありがとうございました。

投稿2017/03/06 12:31

say5140

総合スコア12

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

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

Zuishin

2017/03/06 12:35

私が書いたのとどう違うのですか?
say5140

2017/03/06 23:42

書き方が悪くてがすいません。 Zuishinさんに教えていただいたコードをそのまま適用して試したら期待する結果が得られたので、うまくいった方法として書きました
Zuishin

2017/03/06 23:49

そういうときには自己解決にするんじゃなくて、回答者にベストアンサーをつけるんですよ。 自己解決は回答者の意見が役に立たなくて自分で解決した時のものです。
say5140

2017/03/07 12:59 編集

すみませんでした。 そもそもの入力方法が間違っていたようです。 以後気をつけます。 追記: teratailに関する質問の中に「質問を閉じる方法は「自己解決にする」だけでしょうか」と言うのがあり、今回まったくこのケースと同じでした。使い始めで、解決済みにする方法をよく把握しないまま使っておりました。大変失礼致しました。
guest

0

大まかに見て、まだRecordクラスの記述に欠けたことが多いです。
struct CSVRecord { }
とか。
ReadCSVメソッド、AddRecordメソッド、GetColectionメソッド、IsEndColectionメソッド
等が必要ではないでしょうか。

そして、実行側で
CSVRecords<Record> records = new CSVRecords<Record>();
とでもrecordsを実体化しCSVファイルの読み込み、コレクションへの代入、結果処理等を逐次記述する必要があります。

いきなり、IEnumerable<T>インターフェースをstatic宣言することはできませんから、上記のメソッドを作り込んでから、インスタンスとして操作する形が必要です。

投稿2017/03/05 13:00

seastar3

総合スコア2285

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

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

say5140

2017/03/05 14:12

ありがとうございます。 書籍ではこう言う使い方もできると言う一部分を示していたのかもしれません。 上記のコードを参考にさせていただき、実装を試したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問