C#テキストファイルから1バイト除去する

このQ&Aのポイント
  • 数ギガのテキストファイルから語尾の1バイト(EOF)を瞬時に除去する方法について簡単に説明します。
  • バイトで読んで1バイトのみ出力する方法は時間がかかる上、巨大ファイルには向きません。そこで、下記のソースを使用して語尾を置換する方法を紹介します。
  • 初心者でも簡単に実装できる方法ですので、以下の手順に従ってお試しください。
回答を見る
  • ベストアンサー

C#テキストファイルから1バイト除去する

数ギガのテキストファイルがあり、語尾の1バイト(EOF)を瞬時に除去したいと思います。 バイトで読んで1バイトのみ出力しないと言う方法が一番簡単ですが、時間がかかる上、巨大ファイルには向きません。 下記語尾を置換するソースを書きましたが、除去の方法がわかりません。初心者ですので、簡単にお願いします。 FileStream fs = new FileStream("test.txt", FileMode.Open); byte[] b = new byte[1]; fs.Seek(fs.Length - 1, SeekOrigin.Begin); fs.Write(b, 0, 1); fs.Close();

noname#189001
noname#189001

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>数ギガのテキストファイルがあり、語尾の1バイト(EOF)を瞬時に除去したいと思います。 語尾というか…ファイルの一番最後の1バイトを削除してファイルサイズを切り詰めたい。 ってことでいいんでしょうか? FileStream fs = new FileStream("test.txt", FileMode.Open); fs.SetLength(fs.Length - 1); fs.Close(); で、最後の1バイトを切り捨ててサイズを詰められますが……。 # 切り詰める1バイトがEOF(0x1A?)かどうかまではみていませんけど。

noname#189001
質問者

お礼

ありがとうございます。大変助かりました。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.2

#1の方も書かれていますが、テキストファイルの末尾に必ずコードとしてEOFがあるとは限りません。 むしろもうない方が多いんじゃないかと思いますけど。

noname#189001
質問者

お礼

ありがとうございます。弊社の汎用機は特殊な1バイトがついてるので、困ってました。

関連するQ&A

  • VB2008 ファイルから指定位置の文字を読み込む方法??

    D:\Temp\Test.txt abc123あいう亜伊宇 [イミディエイトウインドウ] ? FileSeek("D:\Temp\Test2.txt", 1) "a" ? FileSeek("D:\Temp\Test.txt", 7) "あ" ? FileSeek("D:\Temp\Test.txt", 8) "あ" 今、FileStream の Seek メソッドを利用した指定位置の文字を1文字だけ戻す関数を作成。 なんとか動作だけはしています。 そこで、私が質問したいのは日本語の扱いのエレガントな方法です。 Seek メソッドでは2バイト文字の1バイト目と2バイト目とを読むケースが発生します。 私は、いずれの場合も"□・"とかではなく"あ"を戻させたいと思っています。 そのために私が考えた方法は次ようです。 ' -------------------------------- ' 指定の位置より2バイト読み込む ' -------------------------------- fs.Seek(p - 1, SeekOrigin.Begin) fs.Read(Buf, 0, Buf.Length) C = ec.GetString(Buf) ' ------------------------------------------ ' 指定の位置より1つ戻して2バイト読み込む ' ------------------------------------------ If p > 1 Then   fs.Seek(p - 2, SeekOrigin.Begin)   fs.Read(Buf, 0, Buf.Length)   D = ec.GetString(Buf) End If ・・・・・ ・・・・・ FileSeek2 = If(Len(D & "") = 1, D, Left(C, 1)) 仮に、最初の読み込みで3バイトを読み込んで2バイト目が何なのかを判別できると・・・。 そうすれば、2度読みする必要はないと思います。 そこで、その方法をご存じであればコードを含めて教えて頂ければ幸いです。

  • VB2005で、ファイル操作 VB6から触っていないので感覚がいまいち。

    VB2005で、ファイルを読み込み2行目から10行までを別ファイルに吐き出すコードがわからないのですが、 わかる方教えていただますか? 途中まではできたのですが、後がわかりません。 よろしくお願いいたします。 また、VB2005でわかりやすい書籍など紹介していただけましたら助かります。 'ファイルを開く Dim fs As New System.IO.FileStream(fileName, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) 'ファイルを読み込むバイト型配列を作成する Dim bs(fs.Length - 1) As Byte 'ファイルの内容をすべて読み込む fs.Read(bs, 0, bs.Length) '閉じる fs.Close() ....[改行をLFとした場合に2行から10行目の内容を別のファイルに書き出すコード]

  • [C#]FTPでの複数のファイルのアップロード

    ネットで調べたところ1つのファイルであれば、 下記の記述でアップロードできることがわかったのですが、 別々のフォルダにあるにファイルを複数同時にアップロードするプログラムがわかりません。 どなたかご教示ください。よろしくお願いいたします。 using System; using System.Net; using System.IO; class FtpWebPut {  static void Main()  {   string uri = "ftp://servername/Upload/secret.png";   string myFile = "tmp.png";   WebRequest req = WebRequest.Create(uri);   req.Credentials = new NetworkCredential("user01", "mypassword");   req.Method = WebRequestMethods.Ftp.UploadFile;   using (Stream st = req.GetRequestStream())   using (FileStream fs = new FileStream(myFile, FileMode.Open))   {    Byte[] buf = new Byte[1024];    int count = 0;    do    {     count = fs.Read(buf, 0, buf.Length);     st.Write(buf, 0, count);    }    while (count != 0);   }  } }

  • 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(); } }

  • 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();

  • VB.NETでファイル操作

    ファイルをオープンしたまま、ファイル内のデータを何度も読み込みたいのですが、Seekで読み込み位置を先頭にし、Peekでループさせ、一度全部読み込み終わった後、Seek文で先頭に戻し、再度ファイルの先頭から読み込ませようと思ったのですができません。 なぜなのでしょうか? // ファイルオープン StreamReader sr = new StreamReader( (System.IO.Stream) File.OpenRead("C:\\Temp\\Test.txt"), System.Text.Encoding.ASCII); // 最後まで読み出す sr.BaseStream.Seek(0, SeekOrigin.Begin); while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } // もう一度 sr.BaseStream.Seek(0, SeekOrigin.Begin); while (sr.Peek() > -1) {         ←このWhileの中に入らない。 Console.WriteLine(sr.ReadLine()); } // ファイルクローズ sr.Close();

  • 【C++/CLI】ファイルオープンに失敗した際のエラー処理

    VC++2005の.NETで言語はC++/CLIにてアプリを作成しています。 FileStream^ fs; String^ file; fs = gcnew FileStream( file, FileMode::Open ); にてファイルをオープンする処理を入れたのですが、 ファイルが存在しない、もしくは何らかのエラー等で、 ファイルが正常に開けない場合のエラー処理は、 どのように判断させればよいのでしょうか? 方法をご存知の方おられましたら、参考例などご教示お願い致します。

  • 【VB.Net】バイト型配列に読み込んで改行区切り

    教えて下さい。 ファイルをバイト型配列に読み込んで、ある固定長に区切(改行)って出力したいです。 以下簡単にサンプルとして作っているのが以下です。 【読み込みファイル.txt】 ---------------------------------------------------------------------------------- AB ---------------------------------------------------------------------------------- このテキストファイルの内容(byte型では、"41 42")を1バイトづつに改行で区切りたいです。 【VB.Net】 ---------------------------------------------------------------------------------- Dim BUFSIZE As Integer = 1 ' 1バイトづつ処理 Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ Dim readSize As Integer ' Readメソッドで読み込んだバイト数 Dim srcName As String = "C:\Temp\読み込みファイル.txt" ' 読み込みファイル名 Dim dstName As String = "C:\Temp\書き込みファイル.txt" ' 書き込みファイル名 Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read) Using dest As New FileStream(dstName, FileMode.Create, FileAccess.Write) While True ' 1バイト読み込み readSize = src.Read(buf, 0, BUFSIZE) ' 読み込むものが無ければ終了 If readSize = 0 Then Exit While ' 改行いれたい部分(動かないけど、、、) buf = (0D,0A) ' 書き込み dest.Write(buf, 0, BUFSIZE) End While End Using End Using ---------------------------------------------------------------------------------- ↓ 理想の処理後 【書き込みファイル.txt】 ---------------------------------------------------------------------------------- A B ---------------------------------------------------------------------------------- 重要なのはバイト型で処理を行いたいです。(文字列ではない) すいませんがよろしくお願いします。

  • VB2008: ファイルから1行づつ読み込む関数のバグの修正方法?

    ' ========================================== ' 全ての行を読み込んで "" 行以外を出力する ' ========================================== Module theGrap   Sub Main()     Dim iNow As Integer = 0     Dim iNext As Integer = 0     Dim aLine As String = ""     Do       iNow = iNext       aLine = FGets("D:\Temp\Test4.txt", iNow, iNext)       If aLine = "" Then Continue Do       Debug.Print(aLine)     Loop Until iNext = -1   End Sub End Module [イミディエイト ウインドウ] 123あいうえお90 123かきくけこ90 123さしすせそ90 と、成功しています。 ' -------------- ' 行末まで読む ' -------------- Do   fs.Seek(iNowPosition, SeekOrigin.Begin)   fs.Read(aBuf, 0, 2)   aChar = ec.GetString(aBuf).Substring(0, 1)   If aChar <> Chr(13) Then     aChars &= aChar   Else     iNowPosition = iNowPosition - 1     Exit Do   End If   iNowPosition += txt.LenB(aChar) Loop While iNowPosition < fs.Length And (aChar <> Chr(13) Or aChar <> Chr(10)) しかし、実は、FGets 関数では1文字づつ読み込んでいます。 そこで、StreamReader で一行を読み込むように修正。 [イミディエイト ウインドウ] 123?????90 123?????90 123?????90 すると見事に化けてしまいました。 化けること自体は理解できるのですが、化けを修正する術がわかりません。 Function FGetl(ByVal aFile As String, _         ByVal iNowPosition As Integer, _         ByRef iNextPosition As Integer) As String   Dim aBuf(1) As Byte   Dim aChars As String = ""   iNextPosition = -1   If File.Exists(aFile) Then     Try       Using fs As FileStream = New FileStream(aFile, FileMode.Open, FileAccess.Read)         Dim sr As StreamReader         Dim ec As Encoding = Encoding.Default         fs.Seek(iNowPosition, SeekOrigin.Begin)         sr = New StreamReader(fs)         aChars = sr.ReadLine         iNowPosition += txt.LenB(aChars)         iNextPosition = NextPosition(fs, iNowPosition)         fs.Close()         Return aChars       End Using     Catch ex As IOException       MsgBox(ex.Message & "(FGets)", MsgBoxStyle.Exclamation, "エラー:")       Return ""     End Try   Else     Return ""   End If End Function 文字の化けを修正する方法を教えて頂ければ幸いです。

  • 画像ファイルの幅と高さを取りたい。

    C Sharp、.Net 2.0の環境で開発しています。 using (System.IO.FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { imagew = System.Drawing.Image.FromStream(fs).Width; //横幅 imageh = System.Drawing.Image.FromStream(fs).Height; //高さ } ※filePathに画像のパスを入れてます。 上記で画像ファイル(すべてjpg)の縦横の高さを取得しているのですが、 ファイルが大量にあると途中でOutOfMemoryExceptionが発生してしまい 困っています。 メモリ不足にならない、何か別のやり方があればご教授いただけないでしょうか。 宜しくお願いいたします。

専門家に質問してみよう