如何在包含逗号的字符串中添加双引号?

时间:2015-04-27 10:49:13

标签: c#

我在数据库中成功导入了以下文件,但我的导入方法在保存过程中删除了双引号。但我想按原样导出这个文件,即在包含分隔符的字符串中添加引号,以便如何实现。

这是我的带有标题和1条记录的csv文件。

PTNAME,REGNO/ID,BLOOD GRP,WARD NAME,DOC NAME,XRAY,PATHO,MEDICATION,BLOOD GIVEN
Mr. GHULAVE VASANTRAO PANDURANG,SH1503/00847,,RECOVERY,SHELKE SAMEER,"X RAY PBH RT IT FEMUR FRACTURE    POST OP XRAY   -ACCEPTABLE WITH IMPLANT IN SITU    2D ECHO MILD CONC LVH  GOOD LV SYSTOLIC FUN,  ALTERED LV DIASTOLIC FUN.",  HB-11.9gm%  TLC-8700  PLT COUNT-195000  BSL-173  UREA -23  CREATININE -1.2  SR.ELECTROLYTES-WNR  BLD GROUP-B +  HIV-NEGATIVE  HBsAG-NEGATIVE  PT INR  -15/15/1.0.    ECG  SINUS TACHYCARDIA  ,IV TAXIMAX 1.5 GM 1-0-1      IV TRAMADOL DRIP 1-0-1      TAB NUSAID SP     1-0-1      TAB ARCOPAN D 1-0-1      CAP BONE C PLUS 1 -0-1      TAB ANXIT 0.5 MG 0-0-1        ANKLE TRACTION 3 KG RT LL  ,NOT GIVEN

这是我的导出方法:

    public void DataExport(string SelectQuery, string fileName)
    {
        try
        {
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(SelectQuery, con);
            da.Fill(dt);

            //Sets file path and print Headers
          //  string filepath = txtreceive.Text + "\\" + fileName;
            string filepath = @"C:\Users\Priya\Desktop\R\z.csv";
            StreamWriter sw = new StreamWriter(filepath);

            int iColCount = dt.Columns.Count;

            // First we will write the headers if IsFirstRowColumnNames is true: //  
            for (int i = 0; i < iColCount; i++)
            {
                sw.Write(dt.Columns[i]);

                if (i < iColCount - 1)
                {
                    sw.Write(',');
                }
            }
            sw.Write(sw.NewLine);

            foreach (DataRow dr in dt.Rows) // Now write all the rows.
            {
                for (int i = 0; i < iColCount; i++)
                {
                    if (!Convert.IsDBNull(dr[i]))
                    {
                        sw.Write(dr[i].ToString());
                    }

                    if (i < iColCount - 1)
                    {
                        sw.Write(',');
                    }
                }
                sw.Write(sw.NewLine);
            }
            sw.Close();
        }
        catch { }
    }

2 个答案:

答案 0 :(得分:0)

if (myString.Contains(","))
{
    myWriter.Write("\"{0}\"", myString);
}
else
{
    myWriter.Write(myString);
}

答案 1 :(得分:0)

您可以做的最简单的事情是用以下代码替换sw.Write(dr[i].ToString());行:

var text = dr[i].ToString();
text = text.Contains(",") ? String.Format("\"{0}\"", text) : text;
sw.Write(text);

但是,您的代码还存在其他一些问题 - 最重要的是,您需要在不正确处理它们的情况下打开大量可支配资源。

我建议稍微改写一下,如下:

public void DataExport(string SelectQuery, string fileName)
{
    using (var dt = new DataTable())
    {
        using (var da = new SqlDataAdapter(SelectQuery, con))
        {
            da.Fill(dt);

            var header = String.Join(
                ",",
                dt.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName));

            var rows =
                from dr in dt.Rows.Cast<DataRow>()
                select String.Join(
                    ",",
                    from dc in dt.Columns.Cast<DataColumn>()
                    let t1 = Convert.IsDBNull(dr[dc]) ? "" : dr[dc].ToString()
                    let t2 = t1.Contains(",") ? String.Format("\"{0}\"", t1) : t1
                    select t2);

            using (var sw = new StreamWriter(fileName))
            {
                sw.WriteLine(header);
                foreach (var row in rows)
                {
                    sw.WriteLine(row);
                }
                sw.Close();
            }
        }
    }
}

我还将数据写入中的数据查询从数据写入流写入器中分离出来。

当然,我正在为包含逗号的文本添加双引号。

我唯一担心的事实是con显然是一个类级别的变量而且它是开放的。那很糟。每次使用时都应打开和关闭连接。你也应该考虑做出改变。

您也可以通过用以下内容替换该块来完全删除流写入:

File.WriteAllLines(fileName, new [] { header }.Concat(rows));

最后,将代码包装在try { ... } catch { }中只是一种不好的做法。这就像说“我正在写一些可能会失败的代码,但我不在乎,我不想被告知它是否失败”。您甚至应该只捕获处理特定例外。在此代码中,您应该考虑捕获文件异常,例如耗尽硬盘空间或写入只读文件等。