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

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

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

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

C#

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

Q&A

解決済

2回答

364閲覧

C#で、"CSVファイルよりデータを文字列配列に取り込むソース"を作成したい

poy327

総合スコア16

CSV

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

C#

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

0グッド

0クリップ

投稿2018/11/15 07:42

タイトル通りC#で、"CSVファイルよりデータを文字列配列に取り込むソース"を作成したいです。

元にC++で作成されていたソースがあり、それを参考になんとかここまではやってみました。

C++からC#に移行したばかりで、分からない中やってみました。

しかし、エラーを吐いてしまい自分で調べながらやってみたのですがその解決法が分かりません。

エラー内容のエラー箇所は太字にしてあります。ご教授ください。

もし元のC++のソースが見たい場合は即座に編集致します。

C#

1private int Csv_spread(FILE fp_csv, char[80][80] sAry) 2 { 3 int i; 4 int j; 5 int node_no = 0; 6 int cnt = 0; 7 int exit_flg = 0; 8 int rtn; 9 int len; 10 char pnt; 11 char pnt1; 12 char pnt2; 13 char[] str; 14 str = new char[512]; 15 char[] stemp; 16 stemp = new char[80]; 17 18 if (fgets(str, sizeof(char), fp_csv) == null) 19 { 20 return -1; 21 } 22 len = str.Length; 23 if (len < 5) 24 { 25 return -2; 26 } 27 pnt = strchr(str,'\r'); 28 29 if (pnt != null) 30 { 31 pnt = ','; 32 } 33 pnt = strchr(str, '\n'); 34 if (pnt != null) 35 { 36 pnt = ','; 37 } 38 exit_flg = 0; 39 cnt = 0; 40 pnt = str; 41 while (exit_flg == 0) 42 { 43 pnt1 = strChr(pnt, ','); 44 if (pnt1 != null) 45 { 46 pnt1 = null; 47 stemp = pnt; 48 pnt = pnt1.Substring(1); 49 } 50 else 51 { 52 stemp = pnt; 53 exit_flg = 1; 54 } 55 Pctab_suppress(ref stemp, 0); 56 Pctab_suppress(ref stemp, 1); 57 sAry[cnt] = stemp; 58 cnt++; 59 } 60 return (cnt); 61 }

エラー内容

①private int Csv_spread(FILE fp_csv, char**[80][80]** sAry)
...型または名前空間の名前'FILE'が見つかりませんでした。(usingディレクティブまたはアセンブリ参照が指定されていることを確認してください。
⇒C++ではFILEと宣言し、*が付きポインタでしたが、C#の場合のFILE宣言が分かりません。

...配列のサイズは変数宣言の中で指定できません('new'を使用して初期化してください)
⇒パラメータ内でnewを用いた二次元配列の宣言が分かりませんでした。

②if (fgets(str, sizeof(char), fp_csv) == null)
...現在のコンテキストに'fgets'という名前は存在しません。
⇒ファイルを読み込みたかったのですが、'FileStream'ではできませんか?

③ pnt = strchr(str,'\r');
...現在のコンテキストに'strchr'という名前は存在しません
⇒代用としてIndexOfが使用できる?

まだあるのですが、他は自力でもう一度やってみます。
上記は自分でもなんとかなりそうになかったため、ご教授頂きたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

C++のことは忘れてください

  1. CsvHelperみたいなライブラリをつかう
  2. クオーテーションとかがなく単純な構造ならsplitとかで頑張る(下記みたいに)

csharp

1var/*string[][]*/ lines = System.IO.File.ReadLines("file.csv").Select(x=>x.Split(',').ToArray()).ToArray(); 2//var/*List<string[]>*/ lines = System.IO.File.ReadLines("file.csv").Select(x=>x.Split(',').ToArray()).ToList(); 3// var lines = System.IO.File.ReadLines("file.csv").Select(x=>x.Split(',')); //仕様が練れてないならこうしとくのがいいと思う

投稿2018/11/15 07:59

編集2018/11/16 05:58
papinianus

総合スコア12705

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

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

papinianus

2018/11/15 09:07

私はC++は分かりませんが、例えばC++でもcsvを読むコードはこういう感じじゃないかと思います https://www.tetsuyanbo.net/tetsuyanblog/23821 わざわざ分かりにくいコードを転写しているように思えてなりません
guest

0

勉強のためとかの理由で自力でコードを書いて何とかしたいということでなければ、TextFieldParser など既存の CSV パーサーを使ってはいかがですか?

TextFieldParser は Microsoft が提供している Visual Basic .NET 用のクラスライブラリです。C# でも Microsoft.VisualBasic.dll を参照に追加してやれば使えます。何といっても Microsoft のライブラリなので、これを使うのが一番無難そうな気がします。

具体的な使い方は以下の記事や、その中からリンクを張ってあるを記事を見てください。

CSV パーサー
http://surferonwww.info/BlogEngine/post/2010/10/28/CSV-parser.aspx

投稿2018/11/15 08:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問