我是C#的初学者。
我有一个巨大的CSV文件与数以千计的数据(数据和列)。有一个过滤器,我已经创建了一个列表称为requiredheaders
。在这个列表中,我只采取了那些需要进一步的头名称。
因此,基于此头列表,我想创建一个新的CSV文件,并需要复制这些头名称和数据,这些CSV头在requiredheaders
列表中可用。
var requiredheaders = new [] { "Column B", "Column D" };
字符串
例如:旧CSV
| 列A|色谱柱B|列C|列D|
| --|--|--|--|
| DEF| ABC| BBB| ABC|
| ABC| DEF| ABC| BBB|
| BBB| ABC| DEF| ABC|
| ABC| BBB| BBB| DEF|
| BBB| ABC| ABC| BBB|
| DEF| DEF| BBB| DEF|
新的CSV应该是:
| 色谱柱B|列D|
| --|--|
| ABC| ABC|
| DEF| BBB|
| ABC| ABC|
| BBB| DEF|
| ABC| BBB|
| DEF| DEF|
我使用了CsvHelper包,我尝试了这个解决方案,但我的requiredheaders
列表是动态的,它会根据一些过滤器而变化。
class Program
{
static void Main()
{
// Specify the paths to the old and new CSV files
string oldCsvFilePath = "old_data.csv";
string newCsvFilePath = "new_data.csv";
// Create a StreamWriter for the new CSV file
using (var newFileWriter = new StreamWriter(newCsvFilePath))
using (var csv = new CsvWriter(newFileWriter, new CsvConfiguration(CultureInfo.InvariantCulture)))
{
// Create a CsvReader for the old CSV file
using (var oldFileReader = new StreamReader(oldCsvFilePath))
using (var csvReader = new CsvReader(oldFileReader, new CsvConfiguration(CultureInfo.InvariantCulture)))
{
// Read the records from the old file and write selected data to the new file
while (csvReader.Read())
{
var record = csvReader.GetRecord<NewClass>();
if (record.SomeCondition)
{
csv.WriteRecord(record);
}
}
}
}
}
}
public class NewClass
{
// Define properties that match the columns in your CSV file
public int Id { get; set; }
public string Name { get; set; }
// Add more properties as needed
}
型
2条答案
按热度按时间4ktjp1zp1#
我维护了一些软件包,这些软件包应该可以使这件事变得非常简单:Sylvan.Data.Csv and Sylvan.Data。Sylvan.Data.Csv软件包提供了CSV读取器/写入器,而Sylvan.Data软件包提供了
Select
方法,该方法提供了DbDataReader上的类似LINQ的投影,CsvDataReader是DbDataReader的扩展。下面是一个完整的C#程序,演示了如何使用这些库来实现你的目标。不需要定义一个强类型的类来表示你的数据,如果需要,
requiredHeaders
可以在运行时动态生成。字符串
gz5pxeao2#
您可以简单地使用
csvReader.GetField(headerName)
从旧文件中选择列值。字符串