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

このQ&Aのポイント
  • C#でテキストの空白行を削除する方法について教えてください。
  • FileStreamクラスとStreamReaderクラスを使用してC#でテキストファイルを読み込み、空白行を削除する方法を教えてください。
  • C#の正規表現を使用して、テキストの空白行を削除する方法を教えてください。
回答を見る
  • ベストアンサー

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; とすると全ての改行が削除されてしまいます。 正規表現をうまくつかうと出来るような気がするんですが・・・

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

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

この処理ならばファイルを一行ずつ読み込んでStringBuilderに追加していく方法でいいんじゃないですか? 正規表現でやりたいならば、 A = Regex.Replace(A, "\n{1,}", "\n"); でいいと思います。 ちなみに改行を\r\nで表していますが、EUCのファイルを処理するのでしょうか?

nirusu
質問者

お礼

言われた通りStringBuilderにしてみました。 さほどストレス無く読み込めるようになりました。 ありがとうございました。

nirusu
質問者

補足

htmlファイルを読み込んで、正規表現でタグを取り除いてtextBoxに表示させています。\r\nにしないと改行されないのでそうしています。

その他の回答 (3)

  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.4

1行1行足すときに Bonjinさんが仰っているStringBuilderを 使えば置換するより速くなると思いますよ。 文字列を連結するには? http://www.atmarkit.co.jp/fdotnet/dotnettips/029strcat/strcat.html

参考URL:
http://www.atmarkit.co.jp/fdotnet/dotnettips/029strcat/strcat.html
nirusu
質問者

お礼

ありがとうございます。すごく早く読み込めるようになりました。

  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.3

置換する方法ではなく、 1.textBox1.Textを空に 2.テキストを1行ずつ読み込む 3.読み込んだ行が「@"^\s*$"」にマッチするかどうか判別 4.マッチしなければtextBox1.Textに足す。 5.2~4を全行読み込むまで続ける。 といった処理の方が簡単だと思います。 1行ずつ読み込む方法 http://dobon.net/vb/dotnet/file/readfile.html (下のほうのやり方です。) 正規表現の活用法 http://www.atmarkit.co.jp/fdotnet/basics/regex01/regex01_01.html

参考URL:
http://www.atmarkit.co.jp/fdotnet/basics/regex01/regex01_01.html
nirusu
質問者

お礼

正規表現の活用法は参考になりました。ありがとうございます。

nirusu
質問者

補足

おっしゃる通り1行ずつ読み込めばできるんですが、ファイルの容量が10MB近くあるのでかなり時間がかかるんです。

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

Regex.Replace(A, "\r\n\r\n", "\r\n"); じゃだめなのかな?

nirusu
質問者

お礼

Regex.Replace(A, "\r\n\r\n", "\r\n") では削除できませんでしたが、回答していただきありがとうございました。まは次回も宜しくお願いします。

関連するQ&A

  • 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#からテキストファイルへの出力について

    お世話になります。 .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(); } }

  • 排他ロックが掛かっているファイルを読み込む

    排他ロックが掛かっている(別のプロセスが使用している) テキストファイルを読み込みたいのですが、 System.IO.FileStreamを実行した後に、IOExceptionエラーが発生し、 読み込みができません。 System.IO.FileStreamにはこだわってませんので、 排他ロックが掛かっているテキストファイルを読み込む方法を ご存知の方は、ご教授頂けませんでしょうか。 宜しくお願いします。 <ソースコード> 'ファイルパス wFullPath = "\\XXX.XXX.XXX.XXX\TEXT\TEST.TXT" (XXX.XXX.XXX.XXX:IPアドレス) 'ファイルを開く Dim fs As New System.IO.FileStream(wFullPath, _ System.IO.FileMode.Open, _ System.IO.FileAccess.ReadWrite, _ System.IO.FileShare.ReadWrite) 'FileStreamを基にしたStringReaderのインスタンスを作成 Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding("shift_jis") Dim sr As New System.IO.StreamReader(fs, enc) 'ファイルの内容をすべて読み込む Dim s As String = sr.ReadToEnd() <開発環境> 言語:VB.NET Microsoft Visual Studio 2008 Microsoft .NET Framework Version 3.5 SP1

  • StreamReaderで読み込んだファイルの行数

    StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); このreaderに20000行程度あるテキストファイルを読み込んだのですが、正確な行数を取得する方法はあるのでしょうか? どうぞ、ご教授よろしくお願い致します。

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

    .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#におけるファイル読み取りの文字化け

    開発初心者です。 //Shift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader(@txtShiteiFile.Text, System.Text.Encoding.GetEncoding(932)); //内容を全て読み込む string textAll = sr.ReadToEnd(); 以上の関数を使ってテキストファイル上の文字を読み取りしているのですが、 textAll 変数に入ったときに文字化けしています。 また、テキストファイルによっては文字化けしないときもあります。 この場合、どのような対処をすればよいのでしょうか?

  • C#での文字置換について

    hoge.txt -------------- #abc_1 111111111 222222222 333333333 #abc_2 111111111 222222222 333333333 #abc_3 ... -------------- StreamReader sr = new StreamReader("hoge.txt", Encoding.GetEncoding("UTF-8")); sr.ReadToEnd(); でファイルを読み込み#abc_1から#abc_2の間の 111... 222... 333... というのを削除して 出力したいのですが分かりません。 (同様に#abc_2から#abc_3の間も削除します) つまり出力は #abc_1 #abc_2 #abc_3 となるように。 宜しくお願いします

  • C#でエクセルみたいな重複行削除

    よくエクセルファイルである「重複行を削除」という 処理を行いたいのですが、検討もつきません。 想像ではStreamReaderを使用して、ファイルを読み出して 処理を行う、というのはわかってるのですが、 単一ファイル内の重複行を探し出して削除する、という処理が浮かびません・・・。 最初、ReadToEnd()で一気に読み出し、 新たにStreamReaderを作成して、ReadLine()で一行ずつ取り出して マッチしたらremoveする、と考えていたのですが、 そもそも一気に取り出したものにマッチするわけがなく、削除はできませんでした・・・。 何か良案がありましたら、教えてくださるとうれしいです。 どなたかご教授いただけると幸いです。

  • twitterAPIについて

    twitterAPIについて です。 今Visual Studio 2008でC#.NETでtwitterのタイムラインを読み込んでみようと思っています。 xmlを読み込むまではできましたが、 そのxmlを抽出する方法が全く分かりません。 このさきどうすればいいのでしょうか? ユーザー1:ツイート ユーザー2:ツイート といった感じにTextBoxに並べるのが目標です。 文字列をxmlに変換する方法があるのでしょうか? 一応ソースコードを載せて起きます。(using部分、例外処理などは除く) private void XmlLoad() { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://twitter.com/statuses/home_timeline.xml"); request.Credentials = new NetworkCredential(IDtext.Text, passText.Text); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; request.Timeout = 10000; System.Net.ServicePointManager.Expect100Continue = false; WebResponse response = request.GetResponse(); Encoding enc = Encoding.GetEncoding(932); StreamReader reader = new StreamReader(response.GetResponseStream(), enc); string result = reader.ReadToEnd(); result = System.Web.HttpUtility.HtmlDecode(result); resultText.Text = result; reader.Close(); response.Close(); } private void OK_Click(object sender, EventArgs e) { XmlLoad(); } オブジェクト(TextBoxなど)は、 IDText(TextBox) passText(TextBox) OK(Button) resultText(TextBox) です! わかる方お願いします。 質問があれば答えます。

  • VB6.0にてStreamReaderを使用したいのですが、

    VB6.0にてStreamReaderを使用したいのですが、 Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", のコードが赤字でエラーになります。 どう修正すればよろしいでしょうか? ご存知の方教えてください。よろしくお願いします。 Dim strTemp As String Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) strTemp = Reader.ReadToEnd msgobox strTemp Reader.Close

専門家に質問してみよう