我有txt文件(65mb)我需要逐行阅读并更改每一行, 例如,我有很多行
User=value Password=value Phone=123456789
User=value Password=value Phone=123456789
User=value Password=value Phone=123456789
我需要将第一个信用卡/手机号码更改为*(安全原因),并获取此类文本并将其保存,或者只是为了显示原始文本文件。
User=value Password=value Phone=*****6789
User=value Password=value Phone=*****6789
User=value Password=value Phone=*****6789
我构建了新的字符串并按行添加到行(已更改)而不是保存,但这需要我很多时间这是我的代码
string NewPath = "";
string lineOfText;
string NewTextFile = "";
using (var filestream = new FileStream(FilePath,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
var file = new StreamReader(filestream, Encoding.UTF8, true, 128);
while ((lineOfText = file.ReadLine()) != null)//here i reading line by line
{
NewTextFile += lineOfText.Substring(0, 124) + "************" +
lineOfText.Substring(136, lineOfText.Length - 136);
NewTextFile += Environment.NewLine;//here i make new string
}
}
NewPath = FilePatharr[1] + "\\temp.txt";
System.IO.File.WriteAllText(NewPath, NewTextFile);//here i save him
任何人都知道更好的方法来执行此操作,我的代码需要很长时间来保存这个大文件 的更新
为什么我会为这个问题得到-2?关于这个问题的问题。我在这里只看到关于如何传递敏感数据的错误答案以及更多不属于这个问题的事情当问题是 - >快速方式更改txt文件并保存
任何方式我都知道如何将这个savig文件speedUp的速度从100kb \ sec提高到3MB \ sec现在它需要20秒而不是像之前那样20min
答案 0 :(得分:2)
您可以保留WriteAllLines
并使用ReadAllLines
:
ReadAllLines
将所有行作为字符串数组string.Replace
逐行替换其内容WriteAllLines
并覆盖现有文件或者您可以逐行使用流读取器/写入器和读/写。您目前正在构建一个包含数百万个连接的字符串,这就是性能问题。
话虽这么说,你这里可能有一个明显的安全问题。为什么信用卡号等重要信息首先存储为纯文本?
答案 1 :(得分:2)
这里的主要问题是你要追加一个字符串。这很快就会变得昂贵。您应该能够在大约五秒钟内处理65 MB。这就是我要做的事情:
string outputFileName = "temp.txt";
using (var outputFile = new StreamWriter(outputFileName))
{
foreach (var line in File.ReadLines(inputFileName))
{
var newLine = line.Substring(0, 124) + "************" +
line.Substring(136, lineOfText.Length - 136);
outputFile.WriteLine(newLine);
}
}
这比追加字符串快得多。如果你真的想在内存中完成所有操作,那么请使用StringBuilder
。而不是
string NewTextFile = "";
使用
StringBuilder NewTextFile = new StringBuilder();
当您编写输出时,请将字符串连接替换为:
NewTextFile.AppendLine(
lineOfText.Substring(0, 124) + "************" +
lineOfText.Substring(136, lineOfText.Length - 136));
最后,将其写入文件:
System.IO.File.WriteAllText(NewPath, NewTextFile.ToString());
答案 2 :(得分:0)
public static string ChangeCardNumber(string FilePath, string txtFileName)
{
string NewPath = "";
string lineOfText;
string NewTextFile = "";
NewPath = FilePatharr[0] + "\\temp_" + txtFileName;
using (var filestream = new FileStream(FilePath,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
var file = new StreamReader(filestream, Encoding.UTF8, true, 128);
System.IO.File.Create(NewPath).Close();
int res = 0;
while ((lineOfText = file.ReadLine()) != null)
{
res++;
if (!lineOfText.Contains("EOF"))
{
NewTextFile += lineOfText.Substring(0, 124) + "************" +
lineOfText.Substring(136, lineOfText.Length - 136);
NewTextFile += Environment.NewLine;
}
if (res % 200 == 0 || lineOfText.Contains("EOF"))//check if endline and if in NewTextFile 200lines
{
System.IO.File.AppendAllText(NewPath, NewTextFile);
NewTextFile = "";
}
}
}
return NewPath;
}
答案 3 :(得分:-6)
嗯,我猜你可以做另一种方式,这种方式是我使用的方式满足我所有的节约需求。 如果你想同时保存它,那么这将有效!或者您可以将它加载到VARIABLES中然后保存它,但这是保存它的代码。它非常简单易于编辑
你去吧
基本代码添加带文字的新行
echo your text here >>filename.txt
解释请访问DropBox链接:https://www.dropbox.com/s/nufkecx1b8088cu/HOW%20TO%20USE%20THIS.txt