使用多行时在C#中进行慢字符串格式化

时间:2015-11-19 22:24:20

标签: c# string parsing templates

我创建了一个进程,该进程读取“模板”文本文件,然后根据String.Format要求使用标记将自定义文本放入其中。

所以,一切正常,但过程很慢。

模板文件可以有大约500-1000行;我正在寻找一种方法来加快这个过程。

有什么想法吗?

以下是我的代码:

templateFilePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", "");
templateFilePath += "\\Templates\\TemplateFile.txt";
tempRequestFilePath = System.IO.Path.GetTempPath();
tempRequestFilePath += Guid.NewGuid();
Directory.CreateDirectory(tempRequestFilePath);
responseFileToWrite = tempRequestFilePath + "\\" + Path.GetFileNameWithoutExtension(zipMergeFilePath) + ".RSP";
if (!File.Exists(templateFilePath))
{
    return false;
}
templateString = System.IO.File.ReadAllText(templateFilePath);
currentRecordNumber = 1;
for (int i = 0; i < createToProcess.rtfText.Lines.Length; i++)
{
    if (createToProcess.rtfText.Lines[i].Contains("TAG ID:"))
    {
        string currentTagID = createToProcess.rtfText.Lines[i].Substring(9, 11).Trim();
        string currentCustomerNumber = createToProcess.rtfText.Lines[i].Substring(25, 12).Trim();
        string currentTaxPeriod = createToProcess.rtfText.Lines[i].Substring(42, 8).Trim();
        string currentCustomerPhoneNumber = createToProcess.rtfText.Lines[i].Substring(55, 9).Trim();
        DateTime datePurchases = (DateTime.Now).AddDays(-7);
        DateTime dateReceived = (DateTime.Now).AddYears(10);
        DateTime dateModified = (DateTime.Now).AddYears(-1);
        string currentResearchCreateRecord = String.Format(templateString,
            currentTagID.PadRight(6),
            currentCustomerNumber.PadRight(12),
            currentTaxPeriod.PadRight(6),
            currentCustomerPhoneNumber.PadRight(8),
            datePurchases.Month.ToString("00") + datePurchases.Day.ToString("00") + datePurchases.Year.ToString("0000"),
            "RecordNo: " + currentRecordNumber.ToString(),
            dateReceived.Month.ToString("00") + dateReceived.Day.ToString("00") + dateReceived.Year.ToString("0000"),
            dateModified.Month.ToString("00") + dateModified.Day.ToString("00") + dateModified.Year.ToString("0000")
            );
        System.Windows.Forms.Application.DoEvents();
        File.AppendAllText(responseFileToWrite, currentResearchCreateRecord);
        currentRecordNumber += 1;
    }
}
using (ZipFile currentZipFile = new ZipFile())
{
    currentZipFile.AddFile(responseFileToWrite, "");
    currentZipFile.Save(zipMergeFilePath);
}
return true;

2 个答案:

答案 0 :(得分:3)

您正在为每一行重新打开文件句柄。这是一项昂贵的操作,会减慢您的速度。

相反,为文件创建(在using块中)StreamWriter,并在不关闭文件的情况下调用WriteLine()写一行。

此外,阅读Lines属性为quite slow。将其更改为foreach循环(或只缓存数组),而不是为每一行重新运行所有代码。

最后,请勿致电DoEvents()

答案 1 :(得分:0)

小心使用“+”操作符,它们非常慢。

您应该使用“StringBuilder”运算符

#include <stdio.h>

int main(void)
{
    FILE* f;
    f = fopen("test.txt", "r");

    char name[256];
    char value[256];

    while(fscanf(f, "%255[^=]=%255[^=]", name, value) == 2)
        printf("%s, %s\n", name, value);

    return 0;
}

https://support.microsoft.com/en-us/kb/306822