需要帮助格式化C#中的分隔.txt文件。我有一个文本文件,其中包含目录列表,当我在记事本或超编辑中打开时,如下所示。第一列是日期和时间,下一列是文件的大小(以字节为单位),第三列是用户名,第四列是文件的名称。每列由一个或多个空格分隔,末尾的文件名列可以在文件名中包含空格。它们包含更多目录,文件中的总行数约为200,000。
目录V:\ word
01/10/2013 12:30 PM 23,000 BUILTIN / ADMINISTRATOR FILE NAME.XLS
10/25/2013 10:39 AM 1,332,432 AMERICAS / DOEJ FILENAME2.CSV
11/31/2000 09:54 PM 21,999,999 AMERICAS / DOEF F_I_L_E_N_A_M_E_4.PDF
V:\ word \ administrators的目录
01/10/2013 12:30 PM 23,000 BUILTIN / ADMINISTRATOR FILENAME.XLS
10/25/2013 10:39 AM 1,332,432 AMERICAS / DOEJ FILENAME2.CSV
11/31/2000 09:54 PM 21,999,999 AMERICAS / DOEF F_I_L_E_N_A_M_E_4.PDF
我的目标是尝试在文件名末尾以固定格式添加目录路径(例如V:\ Word或其他目录)。因此,一旦您看到“目录V:\ word”,那么您知道在新目录之前和之后的每一行,都应该在文件名末尾显示该路径。这将被视为第五栏。
这是一些代码,但我仍然需要帮助。我能够在文件的末尾获得V:\ word,但是如何读取新目录并将其附加到所有后续行的行尾?
private void button1_Click(object sender, EventArgs e)
{
var sbText = new StringBuilder(10000);
string currLine = " Directory of V:\\word ";
try
{
using (StreamReader Reader = new StreamReader(@"C:\V.txt"))
{
while (!Reader.EndOfStream)
{
if (currLine != " Directory of V:\\word ")
{
MessageBox.Show("No Directory");
}
else
{
sbText.AppendLine(Reader.ReadLine() + "V:\\word");
}
}
// When all of the data has been loaded, write it to the text box in one fell swoop
richTextBox1.Text = sbText.ToString();
using (StreamWriter Writer = new StreamWriter(@"C:\NEWFILE.txt"))
{
Writer.WriteLine(sbText);
}
}
}
catch (Exception ex)
{
MessageBox.Show("An error has occured. " + ex.Message);
}
答案 0 :(得分:3)
这是一个相当简单的方法 - 它定义了一个表示数据的简单类,并将每一行解析为一个类实例。它效率很高,结果可以很容易地写入新文件,查询或显示:
void Main()
{
var lines = ReadFile();
lines.ToList().ForEach (Console.WriteLine);
}
IEnumerable<Line> ReadFile()
{
using (var reader = new StreamReader(File.OpenRead(@"file.txt")))
{
const string directoryPrefix = " Directory of ";
Regex splittingRegex = new Regex(@"\s+", RegexOptions.Compiled);
string directory = null;
string line;
while ((line = reader.ReadLine()) != null)
{
line = line.TrimEnd();
if (line.StartsWith(directoryPrefix))
{
directory = line.Substring(directoryPrefix.Length);
continue;
}
// The "6" parameter means the regex will split the string into 6 parts at most--leaving the last column (filename) unsplit
var lineParts = splittingRegex.Split(line, 6);
yield return new Line{ Date = lineParts[0], Time = lineParts[1], Period = lineParts[2], Bytes = lineParts[3], User = lineParts[4], Filename = Path.Combine(directory, lineParts[5]) };
}
}
}
// Define other methods and classes here
class Line
{
public string Date{get;set;}
public string Time {get;set;}
public string Period {get;set;}
public string Bytes {get;set;}
public string User {get;set;}
public string Filename {get;set;}
}
注意:这是从一对解析简单文本文件的辅助方法派生而来的。 my earlier revisions中的一个包含帮助器方法,这些方法可能对您有用(但由于需要记住directory
值,因此不太适合这种方法。)
答案 1 :(得分:2)
您正在递增wCurrLine
但从未重置它。我想你想在每个目录后重置它?
您没有递增totalLines
,而是在label2中显示它。我认为你应该增加它。
如何检查输入的文本行是否是目录条目?如果您的文字与呈现的文字一致,您可以在阅读时检查每一行的第一个字母,并检查它是否为字母“D”。
您需要AppendLine
而非Append
将回车符放回