2016-08-11 4 views
1

사과 나누기로 CSV의 문자가 처리하지 않은 파일 : 연구 n 개의 라인이 돌대가리 질문 ... 나는이처럼 보이는 CSV 파일을 만들려고하고 확실하게 무엇인지에 대한

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

을 대신 다음과 같은 CSV 파일이 나타납니다. Header1,Header2,Header3,\r\n"Value1","Value2","Value3"

내 출력에 실제로 줄 바꿈 문자를 넣으려면 어떻게해야합니까?

내가하고있는 일은 저장된 proc로부터 datatable을 생성하는 WebMethod를 ajax 호출로 호출하는 것이다. 즉, 데이터 테이블은 다음과 같이를 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; 
} 

다시는 몇 변환을 거쳐 아약스 쿼리의 성공 함수에 전달 즉 문자열 ...

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

문자열을 자바 스크립트로 다시 전달하기 전에 디버깅 할 때, 그냥? response를 입력하면 올바르지 않은 올인원 응답을 얻습니다. 그러나, "공진 (공명)"이라고 입력하면 줄 바꿈이 인식되고 모든 것이 올바른 방식으로 보입니다.

또한 나는 틀린/바보 같은 짓을하고 있다는 것을 확신합니다. 그 실례를 지적하는 것도 감사합니다.

+1

디버거 또는 출력 파일에서'\ r \ n'이 (가) 보입니까? – user3185569

+0

모두 그들은 "? response, nq"를 요청할 때 디버거에서 사라지지만 "? response"를 요청할 때 존재합니다. – nwhaught

답변

1

data:text/plain;charset=utf-8, 대신 MIME 유형으로 헤더가 있어야합니다. 이유는 HTTP 형식에 따라 콘텐츠 유형을 알 수 없기 때문에 수신자가이를 application/octet-stream 유형으로 처리해야하기 때문입니다.

이미 encodeURIComponent()을 사용하고 있으므로 문제가 남아있는 것 같습니다.

0

@ AryKay의 답변은 틀림없이 도움이되었지만 한 가지 추가 문제가있었습니다. Ajax 호출에 의해 반환 된 문자열은 \r\n이 리터럴로 이스케이프되었습니다. encodeURIComponent에 전달하기 전에

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

를 실행하고 그것은 마법처럼 달렸다.