【问题标题】:Fast way to change txt file and save it更改txt文件并保存的快速方法
【发布时间】:2014-05-26 12:58:31
【问题描述】:

我有 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 文件并保存它的快速方法

我知道如何将文件速度从 100kb\sec 保存到 3MB\sec 现在需要 20 秒而不是像以前那样的 20 分钟

【问题讨论】:

  • 我不是。我正在从 Cyber​​Ark File Exchange 下载此文件,公司正在制作此文件并将它们放在那里,我的目标是打开文件删除/将第一个 (5) 编号更改为 * *****6789
  • 不要将 NewTextFile 缓冲成一个字符串,你应该将它写入新的文本文件并在之后重命名它。如果您的应用程序在 File.WriteAllText 被终止,您将避免丢失数据
  • This 回答如何读取和处理大文件,写回应该是微不足道的。
  • 当我说公司时,我并不是说那是我的公司,而是客户公司,他们以这样的文件发送给他们

标签: c# asp.net file filestream streamreader


【解决方案1】:

您的主要问题是您要附加到一个字符串。这很快就会变得昂贵。您应该能够在大约 5 秒内处理该 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());

【讨论】:

  • 你的答案比x快3倍
【解决方案2】:

您可以保留WriteAllLines 并使用ReadAllLines

  1. ReadAllLines 将所有行作为字符串数组获取
  2. 枚举数组并使用string.Replace逐行替换其内容
  3. WriteAllLines 并覆盖现有文件

或者您可以使用流读取器/写入器并逐行读取/写入。您目前正在构建一个包含数百万个连接的字符串,这就是性能问题。

话虽如此,您可能在这里遇到了明显的安全问题。为什么信用卡号等关键信息首先以纯文本形式存储?

【讨论】:

    【解决方案3】:
     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;
    
            }
    

    【讨论】:

      【解决方案4】:

      我想你可以用另一种方式来做这件事,这种方式是我用来满足我所有储蓄需求的方式。 如果您想同时保存所有内容,那么这将起作用!或者您可以将它加载到 VARIABLES 中然后保存它,但这是保存它的代码。它非常简单且易于编辑

      你来了

      用文本添加新行的基本代码

      echo your text here >>filename.txt
      

      如需了解详情,请访问 DropBox 链接:https://www.dropbox.com/s/nufkecx1b8088cu/HOW%20TO%20USE%20THIS.txt

      【讨论】:

      • 一个不是 c#,两个不在答案中包含指向您的个人保管箱的链接,将来它将成为死链接,并且在原始问题的基础上会出现更多安全问题,哦,#3它没有回答问题
      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多