Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C过滤CSV数据_C#_String_Csv - Fatal编程技术网

C# 如何使用C过滤CSV数据

C# 如何使用C过滤CSV数据,c#,string,csv,C#,String,Csv,我有一个包含字符串数据的csv文件,如果作业列为空,我想过滤掉所有数据行,创建一个新的csv文件并将剩余的数据行写入其中 字符串数据包含双引号,第一行中的Id、名称、作业实际上是字符串数据,而不是列,这意味着如果数据行的第三个字符串数据是双引号,则会将其过滤掉 "Id" , "Name" , "Job" "1" , "Alan" , "Engineer" "2" , "Bob" , "Technician" "3" , "Charlie" , "" "4" , "Da

我有一个包含字符串数据的csv文件,如果作业列为空,我想过滤掉所有数据行,创建一个新的csv文件并将剩余的数据行写入其中

字符串数据包含双引号,第一行中的Id、名称、作业实际上是字符串数据,而不是列,这意味着如果数据行的第三个字符串数据是双引号,则会将其过滤掉

"Id" , "Name"    , "Job"
"1"  , "Alan"    , "Engineer"
"2"  , "Bob"     , "Technician"
"3"  , "Charlie" , ""
"4"  , "Danny"   , ""
根据上述csv的剩余数据预计为

"Id" , "Name"    , "Job"
"1"  , "Alan"    , "Engineer"
"2"  , "Bob"     , "Technician"

若你们有csv助手工具,你们可以使用工具解析文件列表或数据表,过滤数据和导出

如果没有,您可以尝试:

using (var reader = new StreamReader(sourcePath))
            {
                using (var writer = new StreamWriter(destiPath))
                {
                    String line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        var list = line.Split(',');
                        if (list.Length > 2 && !string.IsNullOrEmpty(list[2].Trim(' ','\"')))
                        {
                            writer.WriteLine(line);
                        }
                    }
                }
            }

您可以使用以下方法来完成此操作:

string[] lines = File.ReadAllLines("csvFile.csv");
List<string[]> csvData = new List<string[]>();
foreach(string line in lines)
{
    using (TextFieldParser parser = new TextFieldParser(new StringReader(line)))
    {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        parser.HasFieldsEnclosedInQuotes = true;
        parser.TrimWhiteSpace = true;
        while (!parser.EndOfData)
            csvData.Add(parser.ReadFields());
    }
}

//Select all lines in csv file in which third column are not empty
List<string[]> filteredCsvData = csvData.Where(x => !string.IsNullOrWhiteSpace(x[2])).ToList();

StringBuilder builder = new StringBuilder();
foreach (string[] line in filteredCsvData)
{
    //Quote all columns back
    string[] quotedLine = Array.ConvertAll(line, x => '"' + x + '"');
    builder.AppendLine(string.Join(',', quotedLine));
}
File.WriteAllText ("newCsvFile.csv", builder.ToString());
如果只需要引用带有逗号的列,请使用:string[]quotedLine=Array.convertalline,x=>''+x+''

注意:以下代码使用Microsoft.VisualBasic.FileIO.TextFieldParser作为CSV解析器。要在.Net Framework中使用它,您需要将Microsoft.VisualBasic包含到您的项目中,也可以在.Net Core 3.0中使用。步骤1:读取CSV并创建列表对象。 对于Poco类:

public class Foo
{
    public string Id { get; set; }
    public string Name { get; set; }        
    public string Job { get; set; }
}
您可以使用以下配置进行读取:

Configuration.Delimiter=",";
Configuration.HasHeaderRecord=false; // has your first line look like header but is not
Configuration.TrimOptions= TrimOptions.Trim | TrimOptions.InsideQuotes;
Configuration.RegisterClassMap<FooMap>();
完整的代码示例,以及:


到目前为止你做了什么?我做了什么?我将csv转换为excel,然后使用excel上载表单,以c语言获取值并进行处理,然后将它们放入另一个excel或csv文件中。对于Excel上传参考,请检查此链接=>您是否格式化这些示例以向我们显示列对齐,还是列之间确实存在所有空格?@Thameem,Excell读取CSV?那真是一个很重的工具,一无所有。像CSVHelper这样的工具更合适。@Steve,说到正确的工具,它是csvReader.Configuration.TrimOptions没有什么大不了的。谢谢,这一个更容易理解,它给了我一些关于字符串操作的灵感谢谢,你的回答很容易理解,给了我一些灵感,但是我在添加VB.FileIO引用时遇到了一些问题,现在问题已经解决了
records.Where(x=> !string.IsNullOrEmpty(x.Job))
        var input = @"""Id"" , ""Name""    , ""Job""
""1""  , ""Alan""    , ""Engineer""
""2""  , ""Bob""     , ""Technician""
""3""  , ""Charlie"" , """"
""4""  , ""Danny""   , """"";

        var records= new List<Foo>();

        //reading CSV to List Foo;
        using (TextReader reader = new StringReader(input))
        using (var csvReader = new CsvReader(reader))
        {
            csvReader.Configuration.Delimiter=",";
            csvReader.Configuration.HasHeaderRecord=false; 
            csvReader.Configuration.TrimOptions=TrimOptions.Trim | TrimOptions.InsideQuotes;
            csvReader.Configuration.RegisterClassMap<FooMap>();
            records = csvReader.GetRecords<Foo>().ToList();
        }

        records.Dump();

        //Filter
        var result = records.Where(x=> !string.IsNullOrEmpty(x.Job)).ToList();
        result.Dump();
    }

    public class Foo
    {
        public string Id { get; set; }
        public string Name { get; set; }        
        public string Job { get; set; }
    }
    public class FooMap : ClassMap<Foo>
    {
        public FooMap()
        {
            Map(m => m.Id).Index(0);
            Map(m => m.Name).Index(1);          
            Map(m => m.Job).Index(2);

            //mapping with column header
            /*Map(m => m.Id).Name("Id");
            Map(m => m.Name).Name("Name");          
            Map(m => m.Job).Name("Job");*/
        }
    }