将相同的行堆叠到数据包中,并写入新文件
Stacking the same lines into packet, and writing to new file
我想知道如何堆叠标题为数据包的相同行并写入下一个文件。例如,我有以下问题:
我逐行读取CSV文件,我想将具有相同标题的行堆叠到一个数据包中。
文件 1:
Test;param1
Test;param2
Test1;param1
Test1;param2
Test1;param3
Test2;param1
结果文件:
Test;[param1,param2]
Test1;[param1,param2,param3]
Test2;[param1]
它不必完全相同,但它是关于如何做类似事情的提示。
我的代码:
var enumLines = System.IO.File.ReadLines(pathZamowienia, Encoding.UTF8);
int factor = 0;
foreach (var line in enumLines)
{
var tabLine = line.Split(';').ToList();
if (factor == 0)
{
Console.WriteLine();
}
else
{
try
{
Title = tabLine[0];
}
catch (FormatException ex)
{
Console.WriteLine("Failure");
}
try
{
Param = tabLine[1];
}
catch (FormatException ex)
{
Console.WriteLine("Failure");
}
factor++;
}
您可以使用 LINQ 查询对行进行分组
// Test input
var enumLines = new List<string> {
"Test;param1",
"Test;param2",
"Test1;param1",
"Test1;param2",
"Test1;param3",
"Test2;param1"
};
// Re-group the parameters
var newLines = enumLines
.Select(s => s.Split(';'))
.GroupBy(a => a[0], a => a[1])
.Select(g => g.Key + ";[" + String.Join(",", g) + "]");
// Test output:
foreach (string line in newLines) {
Console.WriteLine(line);
}
输出:
Test;[param1,param2]
Test1;[param1,param2,param3]
Test2;[param1]
请注意,组 g
本身是聚合值的枚举,并且还有一个 属性 Key
。 GroupBy
的第一个参数选择Key,第二个可选参数选择要聚合的值。如果省略,则聚合输入(字符串数组a
)。
如果输入包含变形的线条,您还可以使用附加的 Where 子句排除它们:
var newLines = enumLines
.Select(s => s.Split(';'))
.Where(a => a.Length >= 2)
.GroupBy(a => a[0], a => a[1])
.Select(g => g.Key + ";[" + String.Join(",", g) + "]");
这就是你能做的。先解析你的文件再转换
var data - new Dictionary<string, List<string>>();
string[] lines = File.ReadAllLines(fileName);
foreach(string line in Lines)
{
string parts = line.Split(';');
if (!data.ContainsKey(parts[0]))
data.Add(parts[0], new List<string>());
data[parts[0]].Add(parts[1]);
}
// then you open stream and write this
foreach(var kvp in data)
{
string line = $"{kvp.Key};[{string.Join(',', kvp.Value)}]"
// write line here
}
// close stream
我想知道如何堆叠标题为数据包的相同行并写入下一个文件。例如,我有以下问题:
我逐行读取CSV文件,我想将具有相同标题的行堆叠到一个数据包中。
文件 1:
Test;param1
Test;param2
Test1;param1
Test1;param2
Test1;param3
Test2;param1
结果文件:
Test;[param1,param2]
Test1;[param1,param2,param3]
Test2;[param1]
它不必完全相同,但它是关于如何做类似事情的提示。
我的代码:
var enumLines = System.IO.File.ReadLines(pathZamowienia, Encoding.UTF8);
int factor = 0;
foreach (var line in enumLines)
{
var tabLine = line.Split(';').ToList();
if (factor == 0)
{
Console.WriteLine();
}
else
{
try
{
Title = tabLine[0];
}
catch (FormatException ex)
{
Console.WriteLine("Failure");
}
try
{
Param = tabLine[1];
}
catch (FormatException ex)
{
Console.WriteLine("Failure");
}
factor++;
}
您可以使用 LINQ 查询对行进行分组
// Test input
var enumLines = new List<string> {
"Test;param1",
"Test;param2",
"Test1;param1",
"Test1;param2",
"Test1;param3",
"Test2;param1"
};
// Re-group the parameters
var newLines = enumLines
.Select(s => s.Split(';'))
.GroupBy(a => a[0], a => a[1])
.Select(g => g.Key + ";[" + String.Join(",", g) + "]");
// Test output:
foreach (string line in newLines) {
Console.WriteLine(line);
}
输出:
Test;[param1,param2]
Test1;[param1,param2,param3]
Test2;[param1]
请注意,组 g
本身是聚合值的枚举,并且还有一个 属性 Key
。 GroupBy
的第一个参数选择Key,第二个可选参数选择要聚合的值。如果省略,则聚合输入(字符串数组a
)。
如果输入包含变形的线条,您还可以使用附加的 Where 子句排除它们:
var newLines = enumLines
.Select(s => s.Split(';'))
.Where(a => a.Length >= 2)
.GroupBy(a => a[0], a => a[1])
.Select(g => g.Key + ";[" + String.Join(",", g) + "]");
这就是你能做的。先解析你的文件再转换
var data - new Dictionary<string, List<string>>();
string[] lines = File.ReadAllLines(fileName);
foreach(string line in Lines)
{
string parts = line.Split(';');
if (!data.ContainsKey(parts[0]))
data.Add(parts[0], new List<string>());
data[parts[0]].Add(parts[1]);
}
// then you open stream and write this
foreach(var kvp in data)
{
string line = $"{kvp.Key};[{string.Join(',', kvp.Value)}]"
// write line here
}
// close stream