C# 如何使用C过滤CSV数据
我有一个包含字符串数据的csv文件,如果作业列为空,我想过滤掉所有数据行,创建一个新的csv文件并将剩余的数据行写入其中 字符串数据包含双引号,第一行中的Id、名称、作业实际上是字符串数据,而不是列,这意味着如果数据行的第三个字符串数据是双引号,则会将其过滤掉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
"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");*/
}
}