导出到csv以忽略注释中的逗号和换行符

本文关键字:换行符 注释 csv | 更新日期: 2023-09-27 18:16:18

我有下面的代码,导出到csv很好,但刚刚意识到它不处理逗号或"评论"字段文本框中的换行符。是否有一种方法可以忽略特定字段或所有字段中的逗号和换行符?

private void saveFileDialogTrack_FileOk(object sender, CancelEventArgs e)
    {
        StringBuilder str = new StringBuilder();
        foreach (DataRow dr in this.trackDataSet.Track)
        {
            foreach (object field in dr.ItemArray)
            {
                str.Append(field.ToString() + ",");
            }
            str.Replace(",", Environment.NewLine, str.Length - 1, 1);
        }
        string name = saveFileDialogTrack.FileName;
        try
        {
            System.IO.File.WriteAllText(name, str.ToString());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        str = null;
    }

csv样本(前几个字段)Barbagallo,31,39,51.01,

        private void openFileDialogTrack_FileOk(object sender, CancelEventArgs e)
    {
        try
        {
            using (StreamReader SR = new StreamReader(openFileDialogTrack.FileName))
            {
                while (!SR.EndOfStream)
                {
                    var CSValues = SR.ReadLine().Split(',');
                    SqlCeConnection myConnection = new SqlCeConnection("Data Source = Track.sdf");
                    myConnection.Open();
                    String str = (@"INSERT INTO Track (Track, StartFinishLineNSDegrees, StartFinishLineNSMinutes, 

......................

VALUES (@track, @SFNSD, @SFNSM,

......................

                        SqlCeCommand cmd = new SqlCeCommand(str, myConnection);
                    cmd.Parameters.AddWithValue("@track", CSValues[0] == string.Empty ? (object)DBNull.Value : CSValues[0]);
                    cmd.Parameters.AddWithValue("@SFNSD", CSValues[1] == string.Empty ? (object)DBNull.Value : CSValues[1]);
                    cmd.Parameters.AddWithValue("@SFNSM", CSValues[2] == string.Empty ? (object)DBNull.Value : CSValues[2]);

导出到csv以忽略注释中的逗号和换行符

根据RFC4180 -逗号分隔值(CSV)文件的通用格式和MIME类型:

包含换行符(CRLF)、双引号和逗号的字段应该用双引号括起来。

为安全起见,并使编码更容易,您可以将所有字段用引号括起来。

替换:

str.Append(field.ToString() + ",");
与这个:

str.Append(string.Format("'"{0}'",", field));

在将字符串添加到stringbuilder

之前,我创建了一个方法来添加引号中的文本。
private string HandelQuote(string text)
        {
            if (string.IsNullOrEmpty(text)) return string.Empty;
            var containsQuote = text.Contains('"');
            var containsComma = text.Contains(',');
            var addQuote = containsComma || containsQuote;
            if (addQuote)
            {
                text = text.Replace("'"", "'"'"");
            }
            return addQuote ? "'"" + text + "'"" : text;
        }