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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2100閲覧

C#でテキストファイルの特定の場所の数値で配列を作る方法

right00

総合スコア1

C#

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/07/15 02:49

編集2021/07/15 09:05

はじめまして、C#を始めたばかりで勉強中のものです。

現在、C#で以下に示したようなテキストファイルの中の特定の数値を配列に入れたいのですがどうすればよいのかわかりません。

test.txt

XX月YY日 start ターゲットナンバー No.1 : x = 0.1 : y = 0.4 : z = 22 No.2 : x = 0.3 : y = 0.4 : z = 21 No.3 : x = 0.6 : y = 0.4 : z = 16 No.4 : x = 0.11 : y = 0.5 : z = 14 No.5 : x = 0.12 : y = 0.4 : z = 10 No.6 : x = 0.14 : y = 0.4 : z = 2 end

具体的には、x= y= z= で書かれている数値をそれぞれ別の配列に入れたいです。
また、ファイルの行数が決まっていないため読み込む際は数値の数が多くても対応できるプログラムにしたいです。

自分が考えたのは、読み込みたい数値の前に「ターゲットナンバー」や「No.1」「x=」などの決まった言葉があるのでそういった文字列を検索し、読み込めたらできるのかなと思っていますがそのやり方もわかっていません。

補足情報

このテキストファイルは他のソフトから出力されるもので、読み込む数値の数が変わります。
テキストファイル側の編集はしない方向で考えたいです。
ちなみに自分はVisualstudioで動かしています。

追記

皆さま回答ありがとうございます。遅くなってしまい申し訳ございません。
回答を参考に以下のような形で文字列による判定、文字列分割で行の数値を分けることができました。

string line; line = sr.ReadLine(); while (line != "ターゲットナンバー") { line = sr.ReadLine(); } line = sr.ReadLine(); string[] arr = line.Split(':','=',','); Console.WriteLine("{0}", string.Join(",", arr));

あとはループさせてすべての行を読み込むのと、必要な数値のみをそれぞれ別の配列にいれるのですが、おすすめのメソッドややり方などあれば教えていただけると助かります。
本日は一度中断するので明日進捗があれば更新致します。

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

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

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

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

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

YAmaGNZ

2021/07/15 02:55

どこまで分かっていてどこが分からないのでしょうか?
right00

2021/07/15 03:02

カンマで区切られているテキストファイルなどの読み込み方はわかるのですが、色々書いてあるファイルの一部だけの読み込み方がわかりません。
退会済みユーザー

退会済みユーザー

2021/07/15 03:05

https://teratail.com/help/question-tips ←読んでください あなたの目的を達成するために、どのようなコードを書いていて、どこで躓いていて、何が分かれば解決できるかを、あなたが書いたコードを掲載するなどして説明してください。今の質問内容では丸投げで、マイナス評価対象です。
guest

回答3

0

ベストアンサー

大まかな流れは以下のような形になるかと思います。

1行ずつ読み込み、「ターゲットナンバー」という行か判断する。
「ターゲットナンバー」という行なら次の行からデータの解析を行う

データ解析部
1行読み込む。読み込んだ行が「end」であれば終了
1行読み込んだ行から正規表現にて各データを取得する。
正規表現が使えないとしても「:」で分割後に「=」で分割するなどString.Splitだけでも取り出すことができるかと思いますし、String.Replaceを利用するなどでも出来るかと思います。
取得したデータはListに追加する。

フローを書くなどして自分の行いたい処理を細分化していって、それを行うにはどのようなコードを書けばいいのか考えましょう。

追記に関しては「C# テキストファイル 読み込み」とでも検索すれば山ほど情報が得られるかと思います。

投稿2021/07/15 03:41

編集2021/07/15 10:15
YAmaGNZ

総合スコア10294

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

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

0

コード作成依頼サイトじゃないので、あなたの質問文を読む限り最低限これがわかれば解決可能だろうと思える情報だけ。

具体的には、x= y= z= で書かれている数値をそれぞれ別の配列に入れたいです。
また、ファイルの行数が決まっていないため読み込む際は数値の数が多くても対応できるプログラムにしたいです

リストに突っ込んで

List<T>.ToArray メソッド

で配列に変換。

そういった文字列を検索し、読み込めたらできるのかなと思っていますがそのやり方もわかっていません。

正規表現を使う。

Regex クラス

情報としてはこれで十分なはずなので、わからない事があれば調べてください。

投稿2021/07/15 03:22

gentaro

総合スコア8949

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

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

0

ヒント: 過去回答

まずは上記を読んでください。

XX月YY日 start ターゲットナンバー No.1 : x = 0.1 : y = 0.4 : z = 22 No.2 : x = 0.3 : y = 0.4 : z = 21 No.3 : x = 0.6 : y = 0.4 : z = 16 No.4 : x = 0.11 : y = 0.5 : z = 14 No.5 : x = 0.12 : y = 0.4 : z = 10 No.6 : x = 0.14 : y = 0.4 : z = 2 end

がテキストファイルとして保存されているのですよね。

これを上記のStep2に当てはめて考えてみましょう。

つまり、『現実世界で、手作業でやるならどうするか』です。

たとえば、

[依頼] (現実世界の)ノートに日付やターゲットナンバー等が書かれているため、 これを使って計算してくれ

とかみたいな感じでしょうか。

計算じゃなくてとある処理(別のノートに書き込むとか)でもいいですが。

"XX月YY日" や "start", "end" 、そして何も書かれていない行や"ターゲットナンバー" は無視するのですよね。(少なくとも今回は対象データではない)

で、対象データは"No.1 : x = 0.1 : y = 0.4 : z = 22" のような部分ですね。

人間だとそのまま読みますが、機械はそんな芸当はできません。

ではどうするか。『規則性を見付ける』のです。

フォーマット(書式)を考えると、

どうやら、

No.[番号] : x = [少数データ] : y = [少数データ] : z = [整数データ]

で一つの行を構成しているようです。

では、x やら y やらの値の『区切り』はどこにあるでしょうか。

そう考えると、

[番号] : [Xデータ] : [Yデータ] : [Zデータ]

となっていますから、区切り文字はどうやら " : " (コロンの前後に半角スペースあり)のようです。

さらに "{対象} = {数字}" となっていますから、

x = [対象データ]

なので、" = " の直後から " : " (または最後まで) で一つのデータと見なせます。

C言語とかのような言語で考えると(つまり泥臭い方法で)、

1. " : " を区切り文字として文字列分割 2. " = " の直後から最後までを一つの数字データとする

とかで取り出せますね。

C# とかの言語とかであれば正規表現が出来るので、泥臭い方法のような感じで規則性を見付けてそれをRegExとかで取り出せばいいいだけです。(言語とかによって微妙に変わるが発想は同じ)


あと、『質問方法を工夫』しましょう。

回答者は質問者と同じ環境にある…わけじゃありません。

提示された情報からしか読み取れません。

言外のことは誰も知りません。

回答者: まずは自分でやりましょう
回答者: やったけどわかんねーから聞いてんだろが!!!

みたいなやりとりをしたりしますが、『そんなことは知りません』。

提示された情報からしか読み取れません。

たとえば、

単に『わからない』と、

(問題文) をやりたくて、(参考にしたサイトのURL)を参考に考えてみました。 (自分なりのコード) としてやってみました。 ですがなぜか(実際の結果)となります。本来は(本来の結果)となるべきですが…… (自分なりの解釈) だと考えているのですが、違うのでしょうか。 [試したこと] 1. (試したこと1): 結果: 結果は変わらず 2. (試したこと2): 結果: なぜか○○が余計につきました…… 3. (試したこと3): 結果: 試したこと2と一緒でした

のように提示するのではどうでしょうか。

全然違いますね。

質問方法を工夫』しましょう。


[追記1]

あとはループさせてすべての行を読み込むのと、必要な数値のみをそれぞれ別の配列にいれるのですが、おすすめのメソッドややり方などあれば教えていただけると助かります。

それは「自分で考える事」です。

『小説を書きたいのですが、オススメの書き方を教えてください』みたいなものです。

仮にいいやり方とかがあっても、それは下手すると盗作になります。

参考として挙げたリンク先にも書いてありますが、『プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である』です。

プログラミングは「こう書けばいい」ではありません。

投稿2021/07/15 05:23

編集2021/07/15 09:11
BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問