プログラミング超初心者なのですが、
下記のような内容のファイルを読み書きするVB.NETのサンプルコードを知りたいです。
INIファイルと似たような内容ですが、セクション([Name])が無いのとコメント行が#です。
【やりたい事】
・「exampleAA = "before"」という行を「exampleAA = "after"」のように書き換えたいです。
・「#exampleBB = "before"」という行を「exampleBB = "before"」のようにコメント解除したいです。
・「abc0:0.defg = "hijk-lmn"」という行を「#abc0:0.defg = "hijk-lmn"」のようにコメントアウトしたいです。
・これらを変更してファイルに上書き保存したいです。
【ファイル内容】
#コメント行
exampleAA = "before"
#exampleBB = "before"
abc0:0.defg = "hijk-lmn"
以降、同じように行があります。
【内容詳細】
・コメント行は「#」で始まります。
・他の行は「KeyName = "Value"」といった形です。
【ファイル情報】
文字コード:Shift-JIS
改行コード:CR+LF
【環境】
・Visual Studio:Visual Studio 2019
・言語種類:Visual Basic
・プロジェクト:Windows フォーム アプリケーション(.NET Framework)
・フレームワーク:.NET Framework 4.7.2
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
テキトーに作りました。
綺麗にするのはご自由にどうぞ。
動作保証についてはあなたの要件に対してしっかり行い、問題があるなら自力で直してください。
https://paiza.io/projects/5JGRdY4VknlCmjPfpeo2Cg
paiza.io上はコンパイルエラーになっていますが、コードを自分の環境に張り付ければ動きます。
度々回答ありがとうございます。
早速、作っていただいた内容を試してみたいと思います。
またアドバイス通り、今後は少しでも自分で実現できるように頑張ってみます!
No.3
- 回答日時:
ini形式にして、固定のセクションを1つ持てば解決しますよね。
ただし、ファイルエンコーディングはUTF-8 BOMありでは読み込めません。
固定セクションを1つすら持ちたくないなら、自前で実装するしかありません。
下記は、極力GetPrivateProfileString()に動作を合わせています。
超初心者かどうかはともかく、ヒントから情報を調べて構築して実現する力、実現できなかったとしてもどこまで考えられたのかを提示する質問能力などがないといけません。
また何かにハマると、親切な回答者から正しい回答が得られるとは限りませんよ。
回答が得られなくても、多少のことは自力で構築できる力がないと、回答が得られなかった時、自分のことなのに、あなたが困ろうがどうでもいい部類の他人任せになってしまいます。
Imports System.IO
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports System.Text
Imports System.Text.RegularExpressions
Module Module1
' iniファイル読込の場合に使うP/Invoke
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (
<MarshalAs(UnmanagedType.LPStr)> ByVal lpApplicationName As String,
<MarshalAs(UnmanagedType.LPStr)> ByVal lpKeyName As String,
<MarshalAs(UnmanagedType.LPStr)> ByVal lpDefault As String,
<MarshalAs(UnmanagedType.LPStr)> ByVal lpReturnedString As StringBuilder,
ByVal nSize As UInt32,
<MarshalAs(UnmanagedType.LPStr)> ByVal lpFileName As String) As UInt32
Sub Main()
' iniファイルの読込 UTF-8 BOMありでは読めない
Dim result As New StringBuilder(100)
Dim directory As String = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
Dim intRet As Integer = GetPrivateProfileString("SECTION1", "KEY1",
"aaaa", result,
result.Capacity - 1, ".\test-ini.ini")
Console.WriteLine(result.ToString())
' iniファイルもどきの読込
Console.WriteLine(NearIni.GetString("KEY1", "", ".\test-nearini.ini"))
Console.ReadLine()
End Sub
End Module
''' <summary>
''' iniファイルもどき
''' </summary>
Module NearIni
Public Function GetString(key As String, defaultValue As String, fileName As String) As String
Dim regex As New Regex("^([^#][^\s]+)\s*=\s*(.+)", RegexOptions.Compiled)
Try
Using fs As FileStream = File.Open(fileName, FileMode.Open, FileAccess.Read),
sr As StreamReader = New StreamReader(fs, Encoding.UTF8)
Do While sr.Peek() > -1
Dim line As String = sr.ReadLine().Trim()
' 空行は無視
If (line.Trim() = String.Empty) Then
Continue Do
End If
Dim m As Match = regex.Match(line)
' パターンマッチしない行は無視
If m.Length = 0 Then
Continue Do
End If
' キーが合致しなければ無視
If m.Groups(1).Value <> key Then
Continue Do
End If
Return m.Groups(2).Value
Loop
Return defaultValue
End Using
Catch e As FileNotFoundException
Return defaultValue
End Try
End Function
End Module
No.2
- 回答日時:
それを求めている人はいないと思います。
なぜなら、ini形式を取れば解決するからです。
方法論は下記になります。
1.ファイルを1行ずつ読み込む。
2.正規表現 ^[^#](.+)\s*=\s*(.+) にマッチしたものを対象にする。
3.\1をtrimしたものをキー、\2をtrimしたものを値としたDictionaryを作る。
【対象】
aaa=aaa
aaa = aaa
aaa = aaa
aaa=aaa
#aaa=aaa
#aaa=aaa
【対象外】
#aaa=aaa
#aaa = aaa
#aaa = aaa
#より前に何があるかによって制御が変わるなら、正規表現をもう少し考えるか、ごりごり判断するかします。
そうではなくて、常にそのファイルを読み込んで、対象キー情報を得る、という形を取るなら、
例えばaaaというキーの値を取りたいなら、
1.ファイルを1行ずつ読み込む。
2.正規表現 ^aaa\s*=\s*(.+) にマッチしたものを対象にする。
3.aaaがキー、\1をtrimしたものを値とする。
【対象】
aaa=aaa
aaa = aaa
aaa = aaa
【対象外】
aaa=aaa
#aaa=aaa
#aaa=aaa
#aaa=aaa
#aaa = aaa
#aaa = aaa
実際に様々な値が入ってきた場合に要件に合致するように実装しなければなりません。
(値に=が入ってたらどうなるのか、など)
No.1
- 回答日時:
多分、良いサンプルは無いかと。
要求仕様が微妙に面倒なため、サンプルの域を超えるものを書かなきゃいけないので。基本File.ReadLinesで1行ずつ読み込んで、#始まりならコメント、それと別にkey=Value形式ならそのpairの情報に分解する正規表現で字句解析する。それを保持する構造体のリストを構成する――みたいのをプログラムするとか。排他制御も考慮する必要があるかも。
それか素直にINI形式に則るとか。
https://docs.microsoft.com/en-us/dotnet/core/ext …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルシートをVBAでpdfで保存したい 2 2022/06/27 10:17
- Visual Basic(VBA) フレームワーク「4.8.1」で、[Sub Main]が動かない。助けて下さい 3 2022/11/14 15:40
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- その他(Microsoft Office) ワードのマクロについて教えてください。 1 2023/01/21 16:01
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Visual Basic(VBA) VSコードでバックスペースキーが効かない(パイソン) 1 2022/11/09 04:00
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- C言語・C++・C# pythonで外部のファイルを読み込む際のエラー 2 2022/04/12 19:22
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/03/28 14:52
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
CSVファイルへの保存の際、デー...
-
大きいサイズのテキストファイ...
-
csvファイルを開かずに文字を検...
-
VBに、Cのincludeのようなもの...
-
ファイル名の先頭にアンダース...
-
C言語のfopenについて教えてく...
-
グローバル変数のよくない使い...
-
同じ名前のファイルを作った場...
-
バッチで118項目のCSVを処理し...
-
static な c 関数の unit-test ...
-
WAVファイル同士の結合が可...
-
【C#】リソースファイルの埋め...
-
マクロを作成したファイルを立...
-
機械学習初心者です。 本を読み...
-
この問題のファイルを読み込ん...
-
分割コンパイルの#defineについて
-
テキストファイルの最終行を削...
-
CSVファイルの入出力と計算
-
VB6.0 特定の位置からの書き換え
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
テキストファイルの最終行を削...
-
VBに、Cのincludeのようなもの...
-
SGファイルって何ですか?
-
C言語のfopenについて教えてく...
-
分割コンパイルの#defineについて
-
アプリケーション終了時例外エ...
-
ドラッグアンドドロップでファ...
-
CSVファイルへの保存の際、デー...
-
ASP .NETでファイル選択ダイア...
-
大きいサイズのテキストファイ...
-
Javascript で INI の読み書き
-
グローバル変数のよくない使い...
-
ハッシュの計算時間について
-
fopenできる上限の変更
-
Excelマクロでの再読込み方法
-
UTL_FILEにて既存のExcelに追加...
-
ファイルの結合
おすすめ情報
ありがとうございます。
質問内容のコードそのものを教えていただけませんか?
ありがとうございます。
質問内容のコードそのものを教えていただけませんか?
INI形式で解決との事ですが、セクション指定なしで読み書き可能なのでしょうか?
補足の追加と変更です。
【内容詳細】
・ファイルをINI形式に変更する事での解決は出来ません。(質問は手段ではなくて目的です)
【ファイル情報】
文字コード:UTF-8
改行コード:CR+LF
よろしくお願いします。
度々ありがとうございます。
お陰様で読み込みは出来たのですが、下記の4つを行うコードはどうすればいいのでしょうか?
>【やりたい事】
>・「exampleAA = "before"」という行を「exampleAA = "after"」のように書き換えたいです。
>・「#exampleBB = "before"」という行を「exampleBB = "before"」のようにコメント解除したいです。
>・「abc0:0.defg = "hijk-lmn"」という行を「#abc0:0.defg = "hijk-lmn"」のようにコメントアウトしたいです。
>・これらを変更してファイルに上書き保存したいです。