C#からテキストファイルへの出力についての解決方法

このQ&Aのポイント
  • C#の開発において、テキストファイルへの出力時に最初の1レコード目が書き出されない現象が発生します。
  • 解決策として、StreamReaderを使用してテキストファイルを読み込む際に、最初の行を読み飛ばすようにすることで解決できます。
  • 詳細なコードの内容や使用しているメソッドについては質問の文章を参照してください。
回答を見る
  • ベストアンサー

C#からテキストファイルへの出力について

お世話になります。 .NET C#で開発をしております。 下記のコードで、テキストファイルへ書き出す際、 何故か最初の1レコード目が書き出されない現象が 起きてしまいます。 どなたかご親切な方、ご教示頂きたく宜しくお願い致します。     記 public static int Syori() { string MitxtPath = @"D:\MData"; string SotxtPath = @"D:\SData"; for (int x = 0; x < 2; x++) { if (x == 0) { FileName = "\\JF01.txt"; } else if (x == 1) { FileName = "\\JS05.txt"; } FileStream fs = new FileStream(MitxtPath + FileName, FileMode.Open); StreamReader r = new StreamReader(fs, Encoding.GetEncoding("Shift_JIS")); if (r.ReadLine() != null) { StreamWriter textFile; textFile = new StreamWriter(SotxtPath + FileName, true, Encoding.GetEncoding("Shift_JIS")); //レコードを書き込む string ZanData; string newData; byte[] bytesData; while ((OkuriNokosi = r.ReadLine()) != null) { bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(ZanData); newData = System.Text.Encoding.GetEncoding(932).GetString(bytesData); textFile.WriteLine(newData); } textFile.Close(); r.Close(); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

「理解してないけど言われたところを直したらうまく動くようになった」では同じことを繰り返します。 StreamReader.ReadLine()は戻り値を受け取るか否かに関わらず「読み込み位置を進める」処理をするので、戻り値を受け取らないReadLineを行うと質問のような現象になるのです。

miruchoko
質問者

お礼

分かりました。 有難うございます。 もっと勉強を深めたいと思います。

その他の回答 (2)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

#1の「迷子になっている」のココロは「if(r.ReadLine() != null)のr.ReadLine()の戻り値も受け取って処理しなきゃならん」って意味なのが理解出来てないような……

miruchoko
質問者

お礼

ご回答頂き有難うございます。 未だにイマイチ意味が理解出来ていないのですが、 とりあえず、if文を削除したらうまくいきました。 有難うございました。

回答No.1

> FileStream fs = new FileStream(MitxtPath + FileName, FileMode.Open); > StreamReader r = new StreamReader(fs, Encoding.GetEncoding("Shift_JIS")); > > if (r.ReadLine() != null) // [*] > { > StreamWriter textFile; > > textFile = new StreamWriter(SotxtPath + FileName, true, Encoding.GetEncoding("Shift_JIS"));//レコードを書き込む [*] で読んだ一行が迷子になっています。

miruchoko
質問者

お礼

迷子!? ただifの中の処理には入っていまして データの書き出しはなされるのですが、 最初の1行だけが書き出されないのは、 迷子が原因と言う事ですか。 ご教示下さいまして有難うございます。

関連するQ&A

  • C# ファイル名を指定してオープン

    StreamWriter swrite = new StreamWriter("C:\\19yamana.csv",false, System.Text.Encoding.GetEncoding("shift-jis")); のファイル名"C:\\19yamana.csv"の部分を変数にしたいのですがうまく出来ません。 やったこと: string fileName = "C:\\19yamana.csv"; StreamWriter swrite = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("shift-jis"));

  • C# 読み込んだテキストファイルが文字化けします

    C#初心者です。 ファイルストリームからファイル名を指定して テキストを読み込んで出力しようとしているのですが、 読み込んだテキストが文字化けしてしまいます。 原因を教えていただけないでしょうか。 下記にコードを記述します。 よろしくお願いいたします。 String s = ""; FileStream fip = new FileStream("test.txt", FileMode.OpenOrCreate); StreamReader r_fip = new StreamReader(fip); while (true) { s = r_fip.ReadLine(); if (s == null) break; fld00.AppendText(s); } r_fip.Close();

  • VB2005でのテキストファイルのアクセス権

    ある条件の下テキストファイルを出力していますが、 出力ファイルを開いた状態で、再度ツールを実行すると 「別のプロセスが・・・アクセスできません。」 というエラーにはじかれてしまいます。 現在VB2005を使用していますが、以前VB6のときはエラーに なりませんでした。 ※Excelの場合はエラーになっていましたけど。 以下私のコードを抜粋 strNewDirはString型でパスが入っています。 Dim stFile As Stream = New FileStream(strNewDir, FileMode.OpenOrCreate) Dim encSJIS As Encoding = Encoding.GetEncoding("shift-jis") Dim swSJIS As StreamWriter = New StreamWriter(stFile, encSJIS) ・・・ swSJIS.Close() という形でファイルアクセスしています。 New FileStreamには[Access]や[Share]などがあるようで、 いろいろ試しましたが、どうもうまくいきません。 ご存知の方いらっしゃいますか?

  • C#でタグを削除する方法

    htmlファイルをtextBoxに読み込んで、その中にあるタグのみを正規表現で削除したいです。 FileStream file = File.Open ( @"c:\test.html", FileMode.Open ); Encoding enc = Encoding.GetEncoding("Shift_JIS"); reader = new StreamReader( file ,enc); StringBuilder text = new StringBuilder(); while(reader.Peek() != -1) {   string A = reader.ReadLine().ToString();   A = Regex.Replace(A,@"<(([^>]|\n)*)>","");   text.Append(A); } textBox1.Text = text.ToString(); とすると、ある程度のタグは削除できるんですが、<DIV などの大文字で書かれたタグが削除できませんでした。 解る方いらっしょいましたら宜しくお願いします。

  • C#でボタンのテキストに全角文字を表示する方法。

    N88-BASIC以来、プログラムには触れてなかったのですが、 かゆいところに手が届くソフトが欲しくてC#などに手を出してしまいました(^^;) はっきり言って基本がほとんど分かってない 初心者ですがよろしくお願いしますm(_ _)m 試行錯誤の上、CSVファイルから、2次元配列に読み込み、 ボタンやラベルのテキストに表示するところまではできたのですが、 CSVファイル内の全角文字が表示されません。 半角文字は問題なく表示されるのですが。。。 ご教授お願いいたしますm(_ _)m。 string[,] us1a; string tb1inf1; public void setting1_Click(object sender,System.EventArgs e) { Directory.SetCurrentDirectory(currentFolder); Directory.SetCurrentDirectory("usersetup"); const string filename1 = "us1.csv"; StreamReader sr; sr = File.OpenText(filename1); int us1y=0; us1a = new string [8,2]; while (sr.Peek() !=-1) { int us1x; string[] stringBuffer; string[] a; StreamReader reader = new StreamReader(filename1, System.Text.Encoding.GetEncoding("Shift-JIS")); stringBuffer = sr.ReadLine().Split(','); a = stringBuffer; for (us1x = 0 ; us1x < 2 ; us1x++) { us1a[us1y,us1x]=stringBuffer[us1x]; } us1y = us1y+1; } sr.Close(); tb1inf1 = us1a[0,0]; tn1.Text = tb1inf1; }

  • C#で空白行を削除する方法

    C#でテキストを読み込んで、文字列型の変数に代入、そしてtextBoxに表示させます。その中にいくつかの空白だけの行があります。その空白行だけを削除する方法がわかりません。わかる方がいらっしゃいましたらよろしくお願いします。 FileStream file = File.Open(@"C:\text.txt",FileMode.Open); Encoding enc = Encoding.GetEncoding("Shift_JIS"); StreamReader reader = new StreamReader(file,enc); string A = reader.ReadToEnd(); A = Regex.Replace(A,"\r\n",""); textBox1.Text = A; とすると全ての改行が削除されてしまいます。 正規表現をうまくつかうと出来るような気がするんですが・・・

  • インスタンス化について

    .NETでのインスタンス化について .NETでプログラムの勉強をしています。インスタンスについてお教えください。 ↓では、「sr」はnewキーワードを使ってインスタンス化しています。 ********************************************************************************** //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容をすべて読み込む string s = sr.ReadToEnd(); //閉じる sr.Close(); //結果を出力する Console.WriteLine(s); ↓では、「enc」はnewキーワードを使ってインスタンス化していません。 ********************************************************************************** //読み込むテキストファイル string textFile = "C:\\text.txt"; //文字コード(ここでは、Shift JIS) System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //テキストファイルの中身をすべて読み込む string str = System.IO.File.ReadAllText(textFile, enc); //行ごとの配列として、テキストファイルの中身をすべて読み込む string[] lines = System.IO.File.ReadAllLines(textFile, enc); ********************************************************************************** 質問1: インスタンス化させる時にはnewキーワードが必要だと思っていましたが、「enc」はnewキーワードが使用されていません。 なぜでしょうか? 質問2: System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); 上記のように、newと同時にパスやエンコーディングを引数として渡しています。この事をコンストラクタとよぶのでしょうか? Googleで調べていますが、いまいち意味がわかりません・・・物凄くひらたくいうとどういったことなのでしょうか?何かプログラムではない、一般的な事で例えて頂けるとありがたいです。 宜しくお願い致します。

  • C#のテキストファイル読み込みについて

    C#のテキストファイル読み込みについて 2次元配列を使います(a[行][列]みたいに テキストファイルを1文字ずつ読み込みます。 そして、改行文字が見つかると行を1つずらします それを繰り返して最後まで読みこむと終わり そんなことをしたいです DOBON.NETでこんなの見つけたんですが 上の処理をしようと思っても、どこをいじればできるのかわかりませんでした //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容を一行ずつ読み込む while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } //閉じる sr.Close(); よくわかるサイトとかあったら教えてください、お願いします

  • C# ファイルを読み込みlistviewに展開

    C#でtxtファイルを読み込み、listviewに展開したいのですが、txtファイルが ○○○,○○○ △△△,△△△ となっている場合、最初の一文字が消えて ○○,○○○ △△△,△△△ と表示されます。 コードは下記の通りです。 System.IO.StreamReader load = new System.IO.StreamReader(@".\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); load.Read(); String file; while ((file = load.ReadLine()) != null) { string[] txtdate = file.Split(','); itemx = new ListViewItem(); itemx.Text = txtdate[0]; itemx.SubItems.Add(txtdate[1]); listView1.Items.Add(itemx); } load.Close(); 何を直せば最初の一文字目も読み込まれるかご教授下さい。

  • ComoBoxでテキストファイルの内容をどうやれば読み込みできますか?

    C#でプログラムを開発しております。 問題は ComonBoxを使って テキストファイルにあるデータをどうやれば読取できますか? 例えば;テキストファイルに 1 2 3 4 四行で、ComoBoxでこの四行を見れるようにしたいですけど。 今は  StreamReader sr = new StreamReader(@"c:\\11.text", Encoding.Default); ComoBox.Items.Add()=sr.readline();を使って失敗しました。エラーはStringの値をIntに変換できないだと提示した。 お願いします。

専門家に質問してみよう