2017-12-26 9 views
1

Ich habe eine file.txt, die ich zu meinem Skript und über d3.request parse.Lesen von Textdatei mit Sonderzeichen mit d3.request

Der Inhalt der Datei ist mit Windows-1250-Codierung codiert und zusätzliche Zeilen müssen gelöscht werden, so dass nur Zeilen, die mit "Date" und "2017" beginnen, übergeben werden sollten.

Bis jetzt habe ich CLI-Lösung verwendet, um Textdatei grep (Entfernen von zusätzlichen Zeilen) und verwenden Sie d3 dsv2json, um sauber json, die geladen werden können, zu erhalten.

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

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

aber jetzt brauche ich diese Vorgänge programmatisch zu tun, wenn TXT-Datei in dem Skript über d3.request geladen wird.

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

Die responseText gibt mir Rohdaten mit falscher Codierung und zusätzlichen Zeilen. Wie man es repariert, damit es am Ende sauberes json produziert?

Antwort

0

Nach weiterer Untersuchung habe ich eine Lösung gefunden.

Um die Datei zu dekodieren, habe ich eine Lösung von here mit TextDecoder verwendet. Um dies zu tun, sollte d3.request.response auf arraybuffer gesetzt werden.

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

Um zusätzliche Zeilen herauszufiltern ich folgenden Schritt verwendet:

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

So schließlich im Rahmen der d3.request:

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()