如何创建一个新的CSV文件,并从旧的巨大的CSV文件复制一些列?

zrfyljdw  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(128)

我是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
}

4ktjp1zp

4ktjp1zp1#

我维护了一些软件包,这些软件包应该可以使这件事变得非常简单:Sylvan.Data.Csv and Sylvan.Data。Sylvan.Data.Csv软件包提供了CSV读取器/写入器,而Sylvan.Data软件包提供了Select方法,该方法提供了DbDataReader上的类似LINQ的投影,CsvDataReader是DbDataReader的扩展。
下面是一个完整的C#程序,演示了如何使用这些库来实现你的目标。不需要定义一个强类型的类来表示你的数据,如果需要,requiredHeaders可以在运行时动态生成。

using Sylvan.Data;
using Sylvan.Data.Csv;

string oldCsvFilePath = "old_data.csv";
string newCsvFilePath = "new_data.csv";
var requiredheaders = new string[] { "Column B", "Column D" };

using var reader = CsvDataReader.Create(oldCsvFilePath);
using var writer = CsvDataWriter.Create(newCsvFilePath);

writer.Write(reader.Select(requiredheaders));

字符串

gz5pxeao

gz5pxeao2#

您可以简单地使用csvReader.GetField(headerName)从旧文件中选择列值。

void Main()
{
    var data = @"Column A,Column B,Column C,Column 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";
    var requiredHeaders = new string[] { "Column B", "Column D" };

    // Create a StreamWriter for the new CSV file
    // using (var newFileWriter = new StreamWriter(newCsvFilePath))
    using (var csv = new CsvWriter(Console.Out, new CsvConfiguration(CultureInfo.InvariantCulture)))
    {
        // Create a CsvReader for the old CSV file
        using (var oldFileReader = new StringReader(data))
        using (var csvReader = new CsvReader(oldFileReader, new CsvConfiguration(CultureInfo.InvariantCulture)))
        {
            // Write the new header
            foreach (var header in requiredHeaders)
            {
                csv.WriteField(header);
            }
            csv.NextRecord();

            // Read the old header
            csvReader.Read();
            csvReader.ReadHeader();
            
            // Read the records from the old file and write selected data to the new file
            while (csvReader.Read())
            {
                foreach (var header in requiredHeaders)
                {
                    csv.WriteField(csvReader.GetField(header));
                }
                csv.NextRecord();
            }
        }
    }
}

字符串

相关问题