2017-12-26 6 views
1

file.txt이 스크립트는 d3.request를 통해 구문 분석해야합니다.d3.request를 사용하여 특수 문자로 텍스트 파일 읽기

파일의 내용은 windows-1250 인코딩으로 인코딩되며 삭제할 추가 줄이 있으므로 '날짜'및 '2017'로 시작하는 줄만 통과해야합니다.

지금까지 grep 텍스트 파일 (추가 선 제거)에 cli 솔루션을 사용했으며 d3 dsv2json을 사용하여로드 할 수있는 깨끗한 json을 얻었습니다.

$ grep -E '^(Date|2017)' file.txt > file.csv 

$ dsv2json -r ';' --input-encoding windows-1250 --output-encoding utf-8 <file.csv> file.json 

그러나 이제는 txt 파일이 d3.request를 통해 스크립트에로드되면 프로그래밍 방식으로 이러한 작업을 수행해야합니다.

d3.request('file.txt') 
    .mimeType('text/csv') 
    .response(function(response) { 
    // response.responseText 
}) 

responseText은 잘못된 인코딩과 추가 행을 가진 원시 데이터를 제공합니다. 그것은 결국 깨끗한 json을 생산할 것입니다 그래서 그것을 고칠 방법?

답변

0

추가 조사 후 해결책을 찾았습니다.

파일을 디코딩하려면 TextDecoder에서 here의 솔루션을 사용했습니다. 이렇게하려면 d3.request.response를 arraybuffer으로 설정해야합니다.

d3.request('file.txt') 
.header('Content-Type', 'text/csv;charset=windows-1250') 
.mimeType('text/csv') 
.responseType('arraybuffer') 
.response(function(xhr) { 
    const decoded = decode(xhr.response) 
    const filtered = filterData(decoded) 
    const json = d3.dsvFormat(';').parse(filtered) 
    return json 
    }) 
.get() 
: d3.request의 맥락에서

function filterData(rawData) { 
    return rawData 
    .split(/\n/) 
    .filter(row => (row.startsWith('Data') || row.startsWith('2017'))) 
    .join('\n') 
} 

을 그래서 마지막 :

function decode(response) { 
    const dataView = new DataView(response); 
    const decoder = new TextDecoder("windows-1250"); 
    const decodedString = decoder.decode(dataView); 
    return decodedString 
} 

내가 단계 다음 사용 여분의 행을 필터링하려면
관련 문제