質問するログイン新規登録
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

5回答

5116閲覧

C# テキストファイルの内容を変更する

diggyyyyy

総合スコア12

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/06/05 11:39

0

0

前提・実現したいこと

【テキストファイルの中身】

[Controls] InvertMouse = 0 MouseLook = 1 InputRate = 0 Sensitivity = 1 NormalTurn = 15 FastTurn = 23

上記テキストファイルの「Sensitivity =1」の
数字を変更したいのです。

【条件】

・Sensitivityから=までのスペース数は環境により異なる ・数字は環境により異なる

なので全行読み込んでいって
「Sensitivity」と書かれている行を削除 → 固定で値を書き込む
という処理を実装しようとしています。

「Sensitivity = 1」を行ごと削除し
「Sensitivity = 100」という固定文言を書き込む

という流れです。

条件一致する行を削除 → その行に文言を書き込むという処理は
どのように書けばいいのでしょうか?

調べても、行を削除、行の末端を取得などはあるのですが
条件一致の行を消すという処理が調べても出てきません。

アドバイスをお願いします。

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

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

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

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

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

guest

回答5

0

csharp

1var path = @"some.ini"; 2System.IO.File.WriteAllLines(path, System.IO.File.ReadLines(path).Select(l => l.StartsWith("Sensitivity") ? l.Substring(0, l.LastIndexOf(" ") + 1) + "100" : l ));

たしかにとっても面倒ですね

投稿2019/06/05 14:05

papinianus

総合スコア12705

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

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

papinianus

2019/06/05 14:07

面倒なのは=のあとが全角スペースだったり半角スペースだったりして、とくに今回肝心のSensitivityの行が全角だったことです
k.matsuda

2019/06/06 00:10

ああ、そういうことだったのかぁ! 使うことがあるかどうかわかりませんが、よい情報をいただきました。
guest

0

そういう形式のテキストファイルはWindows誕生より昔からあって、Windows OSなら簡単に扱えます。
qiitaで見つけた例
C#単独

windowsじゃないよunityだよというなら
これあたり

投稿2019/06/05 13:27

編集2019/06/05 13:31
satocha

総合スコア336

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

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

gentaro

2019/06/05 17:44

なんか話がややこしくなってますがコレですよねぇ。
Zuishin

2019/06/05 22:00

パッと見、私も ini だと思ったんですが、その上位互換の可能性もあったり文字コードが違ったりする可能性もあるので決めうちすると壊れるかもしれません。
gentaro

2019/06/06 08:02

なるほどたしかに。
guest

0

テキストファイルの中身の一部(途中にある Sensitivity = 1)だけを書き直すということはできないので、全部書き直す(メモ帳でやるように、一旦全部読んできて、書き直して保存)しかないと思います。

投稿2019/06/05 12:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こんにちは。

その行を意図した形に書き換え終わった全体データを用意して、それを丸ごとファイルに書きます。この世のほぼ全てのプログラムはそうやってファイルを扱っています。

ファイルなどの「データ」というものは、結局のところ、ディスクに書き込まれた0と1の羅列です。仮に、その途中行だけを書き換えようとしたとして、もしも、その「文字数が増えて/減ってしまったら?」0と1の羅列は、増えた/減った分だけ位置をずらさないといけなくなりますね。どうやって?全部書いた方が早くないですか?

確かに一行書き換えるだけなのに全体を書き直すなんて、とても効率が悪そうに見えますね。はい、そうなんです。そもそもファイル操作は、何をやってもめちゃ効率が悪いんです。なので、みんなできるだけやりたくないんですね。

文字数が一切変わらないとしたら、もしかしたら、ディスク上のバイナリデータを直接書き換えるような裏技が使えたりするかもしれませんね?でも、そんなことをやろうと考えたことはないので、自分もやり方は知りません。できるかどうかも分かりません。

投稿2019/06/05 11:59

tamoto

総合スコア4346

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

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

diggyyyyy

2019/06/05 12:01

なるほど、それも考えたのですが 実は100行以上あり、とても面倒くさくて、省いたのです。 他の方法を探ります。
tamoto

2019/06/05 12:02

どういうことでしょうか?みんな1万行のファイルを書き換えたりしてますけど。何が面倒くさいのか追記した方が良いと思います。
pepperleaf

2019/06/05 12:07

今、ログファイルの更新、そうしてますね。 最新 1000行あれば、良いね、、って。読込んで、追加して、1000行越えたら、先頭から、削除。そして、ファイルを更新。 今時のPCなら、誤差です。
Zuishin

2019/06/06 00:02

100 行程度の読み書きは問題にもならないと思いますが、質問を読む限り、ファイルのディスク上のデータを一部だけ書き換えたいということではなく、ファイルを全部読み込んで一部書き換えてファイルに保存することを想定しているように思います。「とても面倒くさくて」は、ファイルを読み込まず 100 のデータを一から作り直すことへの懸念ではないでしょうか。回答の二~三行目を誤読しているように思います。
guest

0

これ、Iniファイル形式ですよね。

[セクション] キー=設定

という形。

=の前後の空白が0個でも複数でも問題ないはずなので、「C# INIファイルアクセス」でググればいくつかサイトが見つかるはず。WindowsならWin32APIのGetPrivateProfileStringとWritePrivateProfileStringを使えば簡単にアクセスできます。

投稿2019/06/06 08:09

PineMatsu

総合スコア3581

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問