我创建了一个进程,该进程读取“模板”文本文件,然后根据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;
答案 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;
}