检索文本文件数据
Retrieve text file data
我正在尝试从如下所示的文件中检索数据
From: xxxxxxx Sent: xxxxxx To: xxxxxxx Subject: Counter List
[Model Name],ABC
[Serial Number], xxxxxxxxxxx
[Send Date],8888
[Total Counter],00312697
[Total Color Counter],00106667
[Total Black Counter],00206030
[Total Scan/Fax Counter],00035325
[Operating Accumulation Time], 0.0, 13.8, 13.4, 18.0, 11.5, 10.9,
9.8, 15.5, 13.0, 12.1, 17.0, 11.8
[Energizing Accumulation Time],
0.0,727.7,718.2,728.6,667.5,735.2,738.6,627.8,674.8,575.2,500.2,379.3
[Standing Accumulation Time],
0.0,572.3,539.0,514.3,517.4,571.0,575.5,465.2,524.9,454.6,367.4,280.7
[Power Saving Accumulation Time],
0.0,141.6,165.9,196.4,138.5,153.3,153.2,147.1,136.8,108.5,115.9,
86.8
eof
From: xxxxxxx Sent: xxxxxx To: xxxxxxx Subject: Counter List
[Model Name],ABC
[Serial Number], xxxxxxxxxxx
[Send Date],8888
[Total Counter],00598310
[Total Scan/Fax Counter],00002953
eof
我想从 "FROM" 开始阅读每个部分,并以“,”分隔显示数据。
我正在使用 windows 应用程序 C#
请帮忙
我目前有这个
DataTable table = new DataTable();
using (StreamReader sr = new Path.GetFullPath(openFileDialog1.FileName)))
{
while (!sr.EndOfStream)
{
string[] parts = sr.ReadLine().Split(',');
table.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5]);
}
dataGridView1.DataSource = table;
}
但它给出了一个错误,因为列数不匹配 –
这是一个 10 分钟 "hack" 的解决方案。你可以拿走你需要的东西并修复所有有臭味的字符串......但它有效
string contents = File.ReadAllText(@"PATH_TO_FILE");
string[] singleContentCollection = contents.Split(new string[] { "eof" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var singleContent in singleContentCollection)
{
string[] contentLines = singleContent.Split(new char[] { '[' }, StringSplitOptions.None);
foreach (var contentLine in contentLines)
{
string[] contentLineItems = contentLine.Split(new char[] { ']' }, StringSplitOptions.None);
string Label = contentLineItems[0];
Console.Write(Label.Replace(Environment.NewLine, string.Empty));
if (contentLineItems.Length > 1)
{
Console.Write(" : ");
Console.Write(contentLineItems[1].TrimStart(',').Replace(Environment.NewLine, string.Empty));
}
Console.WriteLine();
}
Console.WriteLine("<---------- End Of Item ------------>");
}
这是输出
您收到错误的原因是您的大部分行只有一个逗号,因此 parts
仅包含两项,并且您引用的索引大于数组中的项数.
我不完全清楚的是如何显示数据,因为您似乎有多个数据块(在 'eof' 行之间)和一些的行有多个部分。
这是一种方法,其中每个数据块代表一行,块中的每一行代表一列。
基本上,您首先将所有列添加到 table。我手动执行此操作,但可以通过遍历文件行来完成。然后,只需读取每一行并将列名部分(到第一个逗号的部分)和数据部分添加到数据行中。
当我们到达 eof
时,将 dataRow 添加到 dataTable,当我们到达文件末尾时,将 dataTable 作为数据源添加到您的 dataGridView:
private void button1_Click(object sender, EventArgs e)
{
DataTable table = new DataTable();
table.Columns.Add("HeaderInfo");
table.Columns.Add("Model Name");
table.Columns.Add("Serial Number");
table.Columns.Add("Send Date");
table.Columns.Add("Total Counter");
table.Columns.Add("Total Color Counter");
table.Columns.Add("Total Black Counter");
table.Columns.Add("Total Scan/Fax Counter");
table.Columns.Add("Operating Accumulation Time");
table.Columns.Add("Energizing Accumulation Time");
table.Columns.Add("Standing Accumulation Time");
table.Columns.Add("Power Saving Accumulation Time");
var rowData = table.NewRow();
var filePath = @"c:\public\temp\temp.txt";
foreach (var line in File.ReadAllLines(filePath)
.Where(l => !string.IsNullOrWhiteSpace(l)))
{
var thisLine = line.Trim();
if (thisLine.StartsWith("eof", StringComparison.OrdinalIgnoreCase))
{
// We've reached the end of a block, so add this row to our table
table.Rows.Add(rowData);
rowData = table.NewRow();
}
else if (thisLine.StartsWith("from", StringComparison.OrdinalIgnoreCase))
{
// This line doesn't contain the built in column name, so I made one up
rowData["HeaderInfo"] = thisLine;
}
else
{
var firstComma = thisLine.IndexOf(',');
var columnName = thisLine.Substring(0, firstComma).Replace("[", "").Replace("]", "");
rowData[columnName] = thisLine.Substring(firstComma + 1);
}
}
dataGridView1.DataSource = table;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}
我正在尝试从如下所示的文件中检索数据
From: xxxxxxx Sent: xxxxxx To: xxxxxxx Subject: Counter List
[Model Name],ABC
[Serial Number], xxxxxxxxxxx
[Send Date],8888
[Total Counter],00312697
[Total Color Counter],00106667
[Total Black Counter],00206030
[Total Scan/Fax Counter],00035325
[Operating Accumulation Time], 0.0, 13.8, 13.4, 18.0, 11.5, 10.9, 9.8, 15.5, 13.0, 12.1, 17.0, 11.8
[Energizing Accumulation Time],
0.0,727.7,718.2,728.6,667.5,735.2,738.6,627.8,674.8,575.2,500.2,379.3[Standing Accumulation Time], 0.0,572.3,539.0,514.3,517.4,571.0,575.5,465.2,524.9,454.6,367.4,280.7
[Power Saving Accumulation Time], 0.0,141.6,165.9,196.4,138.5,153.3,153.2,147.1,136.8,108.5,115.9, 86.8
eof
From: xxxxxxx Sent: xxxxxx To: xxxxxxx Subject: Counter List
[Model Name],ABC
[Serial Number], xxxxxxxxxxx
[Send Date],8888
[Total Counter],00598310
[Total Scan/Fax Counter],00002953
eof
我想从 "FROM" 开始阅读每个部分,并以“,”分隔显示数据。 我正在使用 windows 应用程序 C#
请帮忙
我目前有这个
DataTable table = new DataTable();
using (StreamReader sr = new Path.GetFullPath(openFileDialog1.FileName)))
{
while (!sr.EndOfStream)
{
string[] parts = sr.ReadLine().Split(',');
table.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5]);
}
dataGridView1.DataSource = table;
}
但它给出了一个错误,因为列数不匹配 –
这是一个 10 分钟 "hack" 的解决方案。你可以拿走你需要的东西并修复所有有臭味的字符串......但它有效
string contents = File.ReadAllText(@"PATH_TO_FILE");
string[] singleContentCollection = contents.Split(new string[] { "eof" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var singleContent in singleContentCollection)
{
string[] contentLines = singleContent.Split(new char[] { '[' }, StringSplitOptions.None);
foreach (var contentLine in contentLines)
{
string[] contentLineItems = contentLine.Split(new char[] { ']' }, StringSplitOptions.None);
string Label = contentLineItems[0];
Console.Write(Label.Replace(Environment.NewLine, string.Empty));
if (contentLineItems.Length > 1)
{
Console.Write(" : ");
Console.Write(contentLineItems[1].TrimStart(',').Replace(Environment.NewLine, string.Empty));
}
Console.WriteLine();
}
Console.WriteLine("<---------- End Of Item ------------>");
}
这是输出
您收到错误的原因是您的大部分行只有一个逗号,因此 parts
仅包含两项,并且您引用的索引大于数组中的项数.
我不完全清楚的是如何显示数据,因为您似乎有多个数据块(在 'eof' 行之间)和一些的行有多个部分。
这是一种方法,其中每个数据块代表一行,块中的每一行代表一列。
基本上,您首先将所有列添加到 table。我手动执行此操作,但可以通过遍历文件行来完成。然后,只需读取每一行并将列名部分(到第一个逗号的部分)和数据部分添加到数据行中。
当我们到达 eof
时,将 dataRow 添加到 dataTable,当我们到达文件末尾时,将 dataTable 作为数据源添加到您的 dataGridView:
private void button1_Click(object sender, EventArgs e)
{
DataTable table = new DataTable();
table.Columns.Add("HeaderInfo");
table.Columns.Add("Model Name");
table.Columns.Add("Serial Number");
table.Columns.Add("Send Date");
table.Columns.Add("Total Counter");
table.Columns.Add("Total Color Counter");
table.Columns.Add("Total Black Counter");
table.Columns.Add("Total Scan/Fax Counter");
table.Columns.Add("Operating Accumulation Time");
table.Columns.Add("Energizing Accumulation Time");
table.Columns.Add("Standing Accumulation Time");
table.Columns.Add("Power Saving Accumulation Time");
var rowData = table.NewRow();
var filePath = @"c:\public\temp\temp.txt";
foreach (var line in File.ReadAllLines(filePath)
.Where(l => !string.IsNullOrWhiteSpace(l)))
{
var thisLine = line.Trim();
if (thisLine.StartsWith("eof", StringComparison.OrdinalIgnoreCase))
{
// We've reached the end of a block, so add this row to our table
table.Rows.Add(rowData);
rowData = table.NewRow();
}
else if (thisLine.StartsWith("from", StringComparison.OrdinalIgnoreCase))
{
// This line doesn't contain the built in column name, so I made one up
rowData["HeaderInfo"] = thisLine;
}
else
{
var firstComma = thisLine.IndexOf(',');
var columnName = thisLine.Substring(0, firstComma).Replace("[", "").Replace("]", "");
rowData[columnName] = thisLine.Substring(firstComma + 1);
}
}
dataGridView1.DataSource = table;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}