循环遍历 C# 中的列表值并将它们保存到 CSV
Looping through List values in C# and saving them to a CSV
我这里做错了,也许你能帮忙。
我想要实现的是:
- 读取 CSV 文件(仅一行,基于 ID)并将 属性 值映射到一个对象。
- 更新对象的值。
- 将更新后的值写回 CSV 文件。
我可以完成第一步和第二步。
例如,我是这样定义映射到 CSV 字段的对象的:
public string Property1 { get; set; } = string.Empty;
public string Property2 { get; set; } = string.Empty;
public static CSVData ReadFromCSV(string line)
{
string[] values = line.Split(';');
CSVData csvValues = new CSVData();
csvValues.Property1 = values[0];
csvValues.Property2 = values[1];
return csvValues;
}
然后,我这样调用 ReadFromCSVMethod:
id = "123456";
var csvLine = File.ReadAllLines("C:\test.csv")
.Skip(1)
.Select(line => CSVData.ReadFromCSV(line))
.Where(i => i.ID == id)
.ToList();
// update values
csvLine[0].Property1 = "foo";
csvLine[1].Property2 = "bar;
当我查看它们时,我可以在 csvLine 中看到更新的值。
最后,我尝试遍历列表 (csvList),获取值并在这些值之间放置一个分号:
var sb = new StringBuilder();
foreach (var item in csvList)
{
sb.Append(item);
}
但这就是我面临的问题。当我试图查看 StringBuilder 中的内容时,我得到的只是对象名称 (CSVProcessor.CSVData),而不是 属性 值:
var result = sb.ToString();
为什么会这样?
想法是形成一个字符串(新行),然后将其保存为 CSV。
发生这种情况是因为 StringBuilder
使用对象的 ToString
方法将其转换为字符串。 ToString
(继承自 object
)的默认行为是 return 类型名称。
您必须创建一个以分号分隔的字符串,例如与:
sb.Append(item.Property1).Append(';').Append(item.Property2);
您还可以在 CSVData
class:
中覆盖 ToString
public override string ToString()
{
return Property1 + ";" + Property2;
}
然后使用
Append(item);
我这里做错了,也许你能帮忙。
我想要实现的是:
- 读取 CSV 文件(仅一行,基于 ID)并将 属性 值映射到一个对象。
- 更新对象的值。
- 将更新后的值写回 CSV 文件。
我可以完成第一步和第二步。
例如,我是这样定义映射到 CSV 字段的对象的:
public string Property1 { get; set; } = string.Empty;
public string Property2 { get; set; } = string.Empty;
public static CSVData ReadFromCSV(string line)
{
string[] values = line.Split(';');
CSVData csvValues = new CSVData();
csvValues.Property1 = values[0];
csvValues.Property2 = values[1];
return csvValues;
}
然后,我这样调用 ReadFromCSVMethod:
id = "123456";
var csvLine = File.ReadAllLines("C:\test.csv")
.Skip(1)
.Select(line => CSVData.ReadFromCSV(line))
.Where(i => i.ID == id)
.ToList();
// update values
csvLine[0].Property1 = "foo";
csvLine[1].Property2 = "bar;
当我查看它们时,我可以在 csvLine 中看到更新的值。
最后,我尝试遍历列表 (csvList),获取值并在这些值之间放置一个分号:
var sb = new StringBuilder();
foreach (var item in csvList)
{
sb.Append(item);
}
但这就是我面临的问题。当我试图查看 StringBuilder 中的内容时,我得到的只是对象名称 (CSVProcessor.CSVData),而不是 属性 值:
var result = sb.ToString();
为什么会这样?
想法是形成一个字符串(新行),然后将其保存为 CSV。
发生这种情况是因为 StringBuilder
使用对象的 ToString
方法将其转换为字符串。 ToString
(继承自 object
)的默认行为是 return 类型名称。
您必须创建一个以分号分隔的字符串,例如与:
sb.Append(item.Property1).Append(';').Append(item.Property2);
您还可以在 CSVData
class:
ToString
public override string ToString()
{
return Property1 + ";" + Property2;
}
然后使用
Append(item);