1

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

问题是解析后没有保留引号。

我尝试使用parser.HasFieldsEnclosedInQuotes = true;,但由于某种原因它似乎没有保留引号。

当字段包含引号时,此问题会中断,例如:之前

 "some, field" 

 some, field 

作为两个单独的字段

这是我的方法

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");
    }
4

2 回答 2

1

所以你想在修改后有引号string.Join(",", parts)?然后很容易,因为之前只有包含分隔符的字段用引号括起来。只需在String.Join.

所以之前(和期望):

"some, field" 

之后(不需要):

some, field 

这应该有效:

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));

编辑

即使不包含逗号,我也想保留引号

然后就更简单了:

var newFields = fields.Select(f => string.Format("\"{0}\"", f));
于 2013-08-22T14:37:12.800 回答
0

TextFieldParser.HasFieldsEnclosedInQuotes属性的使用方式如下,来自 MSDN 页面:

如果该属性为 True,则解析器假定字段用引号 (" ") 括起来,并且可能包含行尾。

例如,如果一个字段用引号引起来,abc, "field2a,field2b", field3并且此属性为True,则所有用引号引起来的文本都将按原样返回;这个例子将返回abc|field2a,field2b|field3。将此属性设置为 False 将使此示例返回abc|"field2a|field2b"|field3

引号将指示字段的开始和结束,然后可能包含用于通常分隔字段的字符。如果您的数据本身有引号,则需要设置HasFieldsEnclosedInQuotesfalse.

如果您的数据字段可以同时包含分隔符和引号,则您需要在解析之前开始转义引号,这是一个问题。基本上,您将超越简单 CSV 文件的功能。

于 2013-08-22T14:30:21.523 回答