繁体   English   中英

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

[英]how to add double quotes to a string which contains comma?

我已成功将以下文件导入数据库,但导入方法在保存过程中删除了双引号。 但我想按原样导出此文件,即在包含定界符的字符串中加引号,以便了解如何实现此目的。

这是我的带有头和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 { }
    }
if (myString.Contains(","))
{
    myWriter.Write("\"{0}\"", myString);
}
else
{
    myWriter.Write(myString);
}

您可以执行的最简单的操作是替换行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 { }中只是一种不好的做法。 这就像在说“我正在编写可能会失败的代码,但我不在乎,也不想被告知是否失败”。 您甚至应该只捕获您要处理的 特定异常 在此代码中,您应该考虑捕获文件异常,例如硬盘空间用完或写入只读文件等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM