私のコードはこれまでのところ
StreamReader reading = File.OpenText("test.txt");
string str;
while ((str = reading.ReadLine())!=null)
{
if (str.Contains("some text"))
{
StreamWriter write = new StreamWriter("test.txt");
}
}
テキストの検索方法はわかりますが、ファイル内のテキストを自分のテキストに置き換える方法はわかりません。
すべてのファイルの内容を読みます。 String.Replace
に置き換えます。内容をファイルに書き戻します。
string text = File.ReadAllText("test.txt");
text = text.Replace("some text", "new value");
File.WriteAllText("test.txt", text);
あなたが読んでいるのと同じファイルに書き込むのに苦労するでしょう。簡単な方法の1つは、単純にこれを行うことです。
File.WriteAllText("test.txt", File.ReadAllText("test.txt").Replace("some text","some other text"));
あなたはそれをより良くレイアウトすることができます
string str = File.ReadAllText("test.txt");
str = str.Replace("some text","some other text");
File.WriteAllText("test.txt", str);
変更しない場合でも、読み込んだすべての行を出力ファイルに書き込む必要があります。
何かのようなもの:
using (var input = File.OpenText("input.txt"))
using (var output = new StreamWriter("output.txt")) {
string line;
while (null != (line = input.ReadLine())) {
// optionally modify line.
output.WriteLine(line);
}
}
この操作を適切に実行したい場合は、最も簡単な方法は一時出力ファイルを使用し、最後に入力ファイルを出力に置き換えることです。
File.Delete("input.txt");
File.Move("output.txt", "input.txt");
(テキストファイルの途中で更新操作を実行しようとすると、ほとんどのエンコーディングが可変幅であるため、常に同じ長さの置換を使用するのは難しいため、うまくいきません。)
EDIT:元のファイルを置き換えるために2つのファイル操作ではなく、File.Replace("input.txt", "output.txt", null)
を使うほうがよいです。 ( MSDN を参照してください。)
おそらくテキストファイルをメモリに取り込んでから置き換えをしなければならないでしょう。あなたはそれからあなたがはっきりと知っている方法を使ってファイルを上書きしなければならないでしょう。だからあなたは最初になります:
// Read lines from source file.
string[] arr = File.ReadAllLines(file);
その後、ループして配列内のテキストを置き換えることができます。
var writer = new StreamWriter(GetFileName(baseFolder, prefix, num));
for (int i = 0; i < arr.Length; i++)
{
string line = arr[i];
line.Replace("match", "new value");
writer.WriteLine(line);
}
このメソッドはあなたができる操作に対してあなたにいくらかのコントロールを与える。あるいは、単に1行で置き換えを実行できます。
File.WriteAllText("test.txt", text.Replace("match", "new value"));
これが役に立つことを願っています。
これは私が大容量(50 GB)のファイルを使って行った方法です。
私は2つの方法を試しました。1つ目は、ファイルをメモリに読み込み、Regex ReplaceまたはString Replaceを使用する方法です。それから文字列全体を一時ファイルに追加しました。
最初の方法は、いくつかの正規表現の置換にはうまく機能しますが、大きなファイルで多数の置換を行うと、Regex.ReplaceまたはString.Replaceがメモリ不足エラーを引き起こす可能性があります。
もう1つは、一時ファイルを1行ずつ読み取り、StringBuilderを使用して各行を手動で作成し、処理された各行を結果ファイルに追加することです。この方法はかなり速かったです。
static void ProcessLargeFile()
{
if (File.Exists(outFileName)) File.Delete(outFileName);
string text = File.ReadAllText(inputFileName, Encoding.UTF8);
// PROC 1 This opens entire file in memory and uses Replace and Regex Replace --> might cause out of memory error
text = text.Replace("</text>", "");
text = Regex.Replace(text, @"\<ref.*?\</ref\>", "");
File.WriteAllText(outFileName, text);
// PROC 2 This reads file line by line and uses String.IndexOf and String.Substring and StringBuilder to build the new lines
if (File.Exists(outFileName)) File.Delete(outFileName);
using (var sw = new StreamWriter(outFileName))
using (var fs = File.OpenRead(inFileName))
using (var sr = new StreamReader(fs, Encoding.UTF8)) //use UTF8 encoding or whatever encoding your file uses
{
string line, newLine;
while ((line = sr.ReadLine()) != null)
{
newLine = Util.ReplaceDoubleBrackets(line);
//note: don't use File.AppendAllText, it opens the file every time and could take forever to run. Instead use StreamWriter
sw.Write(newLine + Environment.NewLine);
}
}
}
public static string ReplaceDoubleBrackets(string str)
{
//replace [[ with your own delimiter
if (str.IndexOf("[[") < 0)
return str;
StringBuilder sb = new StringBuilder();
//didn't test, but this part gets the string to replace, you might want to put this in a loop if more than one string can be found per line
int posStart = str.IndexOf("[[");
int posEnd = str.IndexOf("]]");
int length = posEnd - posStart;
//... replace String and then append it to StringBuilder
sb.Append(newstr);
return sb.ToString();
}
このコードは私のために働きました
- //-------------------------------------------------------------------
// Create an instance of the Printer
IPrinter printer = new Printer();
//----------------------------------------------------------------------------
String path = @"" + file_browse_path.Text;
// using (StreamReader sr = File.OpenText(path))
using (StreamReader sr = new System.IO.StreamReader(path))
{
string fileLocMove="";
string newpath = Path.GetDirectoryName(path);
fileLocMove = newpath + "\\" + "new.prn";
string text = File.ReadAllText(path);
text= text.Replace("<REF>", reference_code.Text);
text= text.Replace("<ORANGE>", orange_name.Text);
text= text.Replace("<SIZE>", size_name.Text);
text= text.Replace("<INVOICE>", invoiceName.Text);
text= text.Replace("<BINQTY>", binQty.Text);
text = text.Replace("<DATED>", dateName.Text);
File.WriteAllText(fileLocMove, text);
// Print the file
printer.PrintRawFile("Godex G500", fileLocMove, "n");
// File.WriteAllText("C:\\Users\\Gunjan\\Desktop\\new.prn", s);
}