如何在解析csv文件时保留引号? [英] How to keep quotes when parsing csv file?

查看:191
本文介绍了如何在解析csv文件时保留引号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 Microsoft.VisualBasic.FileIO.TextFieldParser 读取csv文件,编辑它,然后解析它。


$ b $



我尝试使用 parser.HasFieldsEnclosedInQuotes = true;

当一个字段包含一个引号时,这个问题就会中断,例如:

p>

 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆