如何在解析csv文件时保留引号? [英] How to keep quotes when parsing csv file?
问题描述
我使用 Microsoft.VisualBasic.FileIO.TextFieldParser
读取csv文件,编辑它,然后解析它。
$ b $
我尝试使用 parser.HasFieldsEnclosedInQuotes = true; $ c
当一个字段包含一个引号时,这个问题就会中断,例如:
在
some,field
b $ b
之后
某些字段
作为两个单独的字段
这里是我的方法
public static void CleanStaffFile()
{
String path = @C:\file.csv;
String dpath = String.Format(@C:\file_ {0} .csv,DateTime.Now.ToString(MMddyyHHmmss));
List< String> lines = new List< String>();
if(File.Exists(path))
{
using(TextFieldParser parser = new TextFieldParser(path))
{
parser.HasFieldsEnclosedInQuotes =真正;
parser.Delimiters = new string [] {,};
while(!parser.EndOfData)
{
string [] parts = parser.ReadFields();
if(parts == null)
{
break;
}
if((parts [12]!=)&&(part [12]!=*,116))
{
parts [12] = parts [12] .Sstrstring(0,3);
}
else
{
parts [12] =0;
}
lines.Add(string.Join(,,parts));
}
}
使用(StreamWriter writer = new StreamWriter(dpath,false))
{
foreach WriterLine(line);
}
}
MessageBox.Show(CSV file successfully processed:\\\
);
}
在你修改它 string.Join(,,parts)
?然后很容易,因为只有包含分隔符的字段包含在引号中。只需在 String.Join
之前再次添加它们即可。
b
$ b
some,field
之后(不需要):
有些字段
这应该工作:
string [] fields = parser。 ReadFields();
//在这里插入您的逻辑....
var newFields = fields
.Select(f => f.Contains(,)?string.Format(\ {0} \,f):f);
lines.Add(string.Join(,,newFields));
编辑
< blockquote>
即使不包含逗号,我也想保留引号
:
var newFields = fields.Select(f => string.Format(\{0} \ , F));
I am using Microsoft.VisualBasic.FileIO.TextFieldParser
to read a csv file, edit it , then parse it.
The problem is the quotes are not being kept after parsing.
I tried using parser.HasFieldsEnclosedInQuotes = true;
but it does not seem to keep the quotes for some reason.
This issue breaks when a field contains a quote for example : Before
"some, field"
After
some, field
As two seperate fields
Here is my method
public static void CleanStaffFile()
{
String path = @"C:\file.csv";
String dpath = String.Format(@"C:\file_{0}.csv",DateTime.Now.ToString("MMddyyHHmmss"));
List<String> lines = new List<String>();
if (File.Exists(path))
{
using (TextFieldParser parser = new TextFieldParser(path))
{
parser.HasFieldsEnclosedInQuotes = true;
parser.Delimiters = new string[] { "," };
while (!parser.EndOfData)
{
string[] parts = parser.ReadFields();
if (parts == null)
{
break;
}
if ((parts[12] != "") && (parts[12] != "*,116"))
{
parts[12] = parts[12].Substring(0, 3);
}
else
{
parts[12] = "0";
}
lines.Add(string.Join(",", parts));
}
}
using (StreamWriter writer = new StreamWriter(dpath, false))
{
foreach (String line in lines)
writer.WriteLine(line);
}
}
MessageBox.Show("CSV file successfully processed :\n");
}
So you want to have quotes after you have modified it at string.Join(",", parts)
? Then it's easy since only fields which contain the separator were wrapped in quotes before. Just add them again before the String.Join
.
So before (and desired):
"some, field"
after(not desired):
some, field
This should work:
string[] fields = parser.ReadFields();
// insert your logic here ....
var newFields = fields
.Select(f => f.Contains(",") ? string.Format("\"{0}\"", f) : f);
lines.Add(string.Join(",", newFields));
Edit
I would like to keep quotes even if doesn't contain a comma
Then it's even easier:
var newFields = fields.Select(f => string.Format("\"{0}\"", f));
这篇关于如何在解析csv文件时保留引号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!