none
VBのテキストファイル入出力 RRS feed

  • 質問

  • VBで作成するプログラムで、次のような実行方法でテキストファイルを入出力したいのですが
    どのような方法(コーディング)がありますか?
     vbprog.exe <in.txt>out.txt
    VB完全初心者です。どなたかお教え下されば幸いです。よろしくお願いいたします。
    2009年9月12日 5:19

回答

  • 実現したいことは読み取れます。ただし、初音玲さん、gekkaさんには通じなかったようです。
    たしかに勘違いの可能性が高そうです(汗
    「VB完全初心者」という言葉を見てリダイレクトは無いだろうという先入観があったのと、普段はパイプの方しか使って無いので"<>”を完全に失念してました。

        Sub Main()
            Try
                If Console.KeyAvailable Then
                End If
                Console.Error.WriteLine("リダイレクト入力されていません")
                Return
            Catch ex As InvalidOperationException
                'リダイレクト入力されている場合このエラー
            End Try
    
            Dim lineNumber As Integer = 1
            Dim line As String
            Do Until Console.In.Peek = -1
                line = Console.In.ReadLine()
                Console.Out.WriteLine(lineNumber.ToString("00000:") + line)
                lineNumber = lineNumber + 1
            Loop
        End Sub
    • 回答としてマーク ヘグリン 2009年9月13日 0:19
    2009年9月12日 12:34
  • あってます。ファイルの終端かどうかの判定です。
    • 回答としてマーク ヘグリン 2009年9月13日 0:19
    2009年9月12日 22:40

すべての返信

  • Command$()

    もしくは

    Shared Sub Main(ByVal args() As String)
    'この中で args(0)とか args(1)とかを処理してあげる
    End Sub
    って感じのサブプロシージャを定義してスタートアップフォームで「Sub Main」を指定


    http://blogs.wankuma.com/hatsune/
    2009年9月12日 7:11
  • コマンドプロンプトによるリダイレクトなので、argsには入りませんよ。
    # だからといって、完全初心者にどう教えたらいいのかは分かりませんが…。
    2009年9月12日 7:13
  • コンソールアプリでプロジェクトを作成して、Sub Main()のところに以下のコードを貼りつけ。


        Sub Main()
            '引数を取得する
            Dim args() As String = System.Environment.GetCommandLineArgs()
    
            If (args.Length >= 3) Then '引数が2個以上あれば
                'Dim exeFileName as String = args(0) '0番目は実行ファイルパスになっている
                Dim InText As String = args(1) '入力ファイルのパスを取得
                Dim OutText As String = args(2) '出力ファイルのパスを取得
    
                Console.WriteLine("読み込みファイル:" + InText)
                Console.WriteLine("書き込みファイル:" + OutText)
    
                Dim input As System.IO.StreamReader = Nothing
                Dim output As System.IO.StreamWriter = Nothing
    
                Try '途中でエラーが発生した時の処理
    
                    '入力ファイルをテキスト読み込みで開く。文字のエンコードはOS規定のsjis
                    input = New System.IO.StreamReader(InText, System.Text.Encoding.Default)
                    '出力ファイルテキスト書き込みで開く(新規作成もしくは上書き)。文字のエンコードはOS規定のsjis
                    output = New System.IO.StreamWriter(OutText, False, System.Text.Encoding.Default)
    
                    Dim line As String
                    Dim lineNumber As Integer = 1
                    Do Until input.EndOfStream 'ファイルの最後になるまで繰り返し実行
                        line = input.ReadLine() '1行分読み込む
                        output.WriteLine(lineNumber.ToString("00000:") + line) '行頭に行番号を追加して読み込んだ行を書き込む
                        lineNumber = lineNumber + 1
                    Loop
    
                Catch ex As System.IO.IOException
                    'パスが異常だったりしてファイルが開けなかった場合に実行される
    
                    Console.ForegroundColor = ConsoleColor.Red
                    Console.Error.WriteLine("ファイルを開けませんでした")
    
                Finally '後始末
                    If (input IsNot Nothing) Then
                        input.Close() '開いたファイルを閉じる
                    End If
                    If (output IsNot Nothing) Then
                        output.Close() '開いたファイルを閉じる
                    End If
                End Try
            End If
        End Sub
    2009年9月12日 8:15
  • 佐祐理 さんが指摘されているように、現状の回答は ヘグリン さんが実現したいことへの回答か分かりません。
    まずは、そこを確かにするべきではありませんか?
    (例:スペースがないので、args ではきちんと分割されていない。コマンドプロンプトから実行すると、リダイレクトと認識されるので、args には全く入らない)

    VBで作成するプログラムで、次のような実行方法でテキストファイルを入出力したいのですが
    どのような方法(コーディング)がありますか?
     vbprog.exe <in.txt>out.txt

    この実行方法というのは、どのようなものでしょうか?

    1.ショートカットファイルのプロパティのリンク先の末尾を "vbprog.exe <in.txt>out.txt"  となるように修正してから、ショートカットを実行
    2.コマンドプロンプトで "vbprog.exe <in.txt>out.txt" を打ち込んで実行
    3.バッチファイルで "vbprog.exe <in.txt>out.txt" と書き込んで、そのバッチファイルを実行
    4.プロジェクトのプロパティのデバッグタブ "コマンド ライン引数" に "<in.txt>out.txt" を入力して実行

    ※1番と4番の場合、スペースがあるかどうかも極めて重要です。スペースがなく、詰めて "<in.txt>out.txt" と書くのでしょうか?

    このほかの実行方法もあるかもしれません。どういった場所で "vbprog.exe <in.txt>out.txt" と書くのか教えて下さい。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月12日 9:38
    モデレータ
  • 実現したいことは読み取れます。ただし、初音玲さん、gekkaさんには通じなかったようです。

    コマンドプロンプト(スタートメニューの アクセサリ → コマンドプロンプト にあります)に書くのでしょう。バッチファイルでも同じことです。

    またコマンドプロンプトはスペースで区切らなくても認識し、分解します。最悪 vbprog<in.txt>out.txt でも認識します。
    その上で、このようにプログラムを起動するとin.txtの内容をConsole.Inから読み出せます。またConsole.Outに書いた内容(もしくはConsole.WriteLineなど)はout.txtに書き込まれます。
    VB.NET特有のMyなんたらがあるかもしれないですが、それについては私は知りません。

    この辺りを説明しているドキュメントが見あたりませんでした。コマンド リダイレクト演算子 を使用する ぐらいでしょうか。
    2009年9月12日 10:25
  • 申し訳ありません。間違えて回答の候補としてクリックしてしまいました。orz

    コマンドプロンプト(スタートメニューの アクセサリ → コマンドプロンプト にあります)に書くのでしょう。バッチファイルでも同じことです。

    私もリダイレクトの可能性は高いと思っていますが、念のため、1番と4番の候補を出しています。


    ただ、in.txt、out.txt という名前とリダイレクトの書き方からして、1番と4番はほぼないか…。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月12日 10:38
    モデレータ
  • 実現したいことは読み取れます。ただし、初音玲さん、gekkaさんには通じなかったようです。
    たしかに勘違いの可能性が高そうです(汗
    「VB完全初心者」という言葉を見てリダイレクトは無いだろうという先入観があったのと、普段はパイプの方しか使って無いので"<>”を完全に失念してました。

        Sub Main()
            Try
                If Console.KeyAvailable Then
                End If
                Console.Error.WriteLine("リダイレクト入力されていません")
                Return
            Catch ex As InvalidOperationException
                'リダイレクト入力されている場合このエラー
            End Try
    
            Dim lineNumber As Integer = 1
            Dim line As String
            Do Until Console.In.Peek = -1
                line = Console.In.ReadLine()
                Console.Out.WriteLine(lineNumber.ToString("00000:") + line)
                lineNumber = lineNumber + 1
            Loop
        End Sub
    • 回答としてマーク ヘグリン 2009年9月13日 0:19
    2009年9月12日 12:34
  • いろいろのご意見ありがとうございます。舌足らずのところがあり恐縮しています。
    主旨はおおよそ次の通りです(それでも説明不足かも知れませんが)。
    1.コマンドプロンプトからリダイレクトで、
    2.in.txtファイルのの内容を1行づつ読み込み、
    3.VBで作成したvbprogで目的の処理(特にフォームは必要としない)して、
    4.その結果を、out.txtファイルに1行づつ書き出す。
    と言うものです。コマンドプロンプトからの入力は、
    c:\>c:\vbprog.exe <c:\in.txt> c:\out.txt

    よろしくお願いします。
    2009年9月12日 22:10
  • gekkaさん、回答ありがとうございます。
    完全初心者の悲しさで、Console.In.Peek = -1 の意味が分かっていません。
    何となく、「入力ファイルの終わりまで」のような気がするのですが。。。

    2009年9月12日 22:33
  • あってます。ファイルの終端かどうかの判定です。
    • 回答としてマーク ヘグリン 2009年9月13日 0:19
    2009年9月12日 22:40
  • 左祐理さん、ありがとうございます。了解いたしました。
    2009年9月12日 23:18