CSV文件中的 字符不被视为换行符

characters in CSV file not treated as line breaks

本文关键字:换行符 字符 文件 CSV      更新时间:2023-09-26

为这个愚蠢的问题道歉…我正在尝试创建一个CSV文件,看起来像这样:

Header1,Header2,Header3, "Value1","Value2","Value3"

相反,我得到一个CSV文件,看起来像这样:Header1,Header2,Header3,'r'n"Value1","Value2","Value3"

我如何让我的CRLF字符在输出中实际产生换行?

我正在做的是使一个ajax调用WebMethod,从存储过程中生成一个数据表,然后该数据表被解析为CSV,如下所示:

if (!createHeaders)//I deal with the headers elsewhere in the code
{
    foreach(DataColumn col in table.Columns){
        result += col.ColumnName + ",";
    };
    result += Environment.NewLine;
}
for (int rowNum = 0; rowNum < table.Rows.Count; rowNum++) 
{
    for (int colNum = 0; colNum < table.Columns.Count; colNum++)
    {
        result += "'"" + (table.Rows[rowNum][colNum]).ToString();
        result += "'",";
    };
    result += Environment.NewLine;
};
return result;
}

然后将该字符串传递回ajax查询的成功函数,在那里进行更多的转换…

function getExportFile(sType) {
    var alertType = null
    $.ajax({
        type: "POST",      
        url: "./Services/DataLookups.asmx/getExcelExport",
        data: JSON.stringify({ sType: sType }),
        processData: false,
        contentType: "application/json; charset=utf-8",
        dataType: "text",
        success: function (response) {                
            response = replaceAll(response,"'''"", "'"")
            response = response.replace("{'"d'":'"", "")
            response = response.replace("'"}", "")
            download(sType + ".csv",response)
        }
    });
    function download(filename, text) {
        var element = document.createElement('a');
        element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
        element.setAttribute('download', filename);
        element.style.display = 'none';
        document.body.appendChild(element);
        element.click()
        document.body.removeChild(element);
    }
    function escapeRegExp(str) {
        return str.replace(/([.*+?^=!:${}()|'[']'/''])/g, "''$1");
    }
    function replaceAll(str, find, replace) {
        return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
    }

在将字符串传递回javascript之前的调试中,如果我只是键入?response,我将得到不正确的,全部在一行上的响应。但是,当我输入? response时,nq可以识别换行符,并且一切看起来都是正常的。

而且,我确信我在这里做错了很多/愚蠢的事情。我也很感激你指出这些例子。

您的报头应该将data:Application/octet-stream,作为mime类型而不是data:text/plain;charset=utf-8,,原因是根据HTTP规范,当内容类型未知时,收件人应将其视为类型应用程序/octet-stream。

由于您已经在使用encodeURIComponent(),这似乎是剩下的唯一问题。

@AryKay的回答肯定有帮助,但还有一个额外的问题。Ajax调用返回的字符串将'r'n转义为文字。运行

Response = response.replace (/''r''n/g, "'r'n")

在通过encodeURIComponent之前,它像一个魅力一样运行。