2010-02-19 13 views
6

Ich habe mir die anderen Ruby/Encoding-bezogenen Beiträge angeschaut, konnte aber nicht herausfinden, warum das Folgende nicht funktioniert. Wahrscheinlich nur, weil ich dicht bin, aber hier ist die Situation.Ruby string encoding problem

Verwenden von Ruby 1.9 auf Windows. Ich habe eine Reihe von CSV-Dateien, die einige Daten am Ende jeder Zeile angehängt werden müssen. Immer wenn ich mein Skript ausführe, sind die angehängten Zeichen Kauderwelsch. Der Eingabetext scheint IBM437-Codierung zu sein, während meine Zeichenfolge, die ich angehängt habe, als US-ASCII beginnt. Nichts, was ich in Bezug auf das Erzwingen der Codierung für die Eingabezeichenfolgen oder die Anhangszeichenfolge versucht hat, scheint die resultierende Ausgabe zu ändern. Ich bin ratlos. Die aktuelle Kodierungsversion ist einfach die letzte, die ich ausprobiert habe.

def append_salesperson(txt, salesperson) 
    if txt.length > 2 
    return txt.chomp.force_encoding('US-ASCII') + %(, "", "", "#{salesperson}") 
    end 
end 

salespeople = Hash[ 
    "fname", "Record Manager"] 

outfile = File.open("ActData.csv", "w:US-ASCII") 

salespeople.each do | filename, recordManager | 
    infile = File.open("#{filename}.txt") 
    infile.each do |line| 
    outfile.puts append_salesperson(line, recordManager) 
    end 
    infile.close 
end 
outfile.close 
+0

Verwenden Sie den magischen Codierungskommentar in Ihrem Skript? – kch

Antwort

0

vielleicht txt.chomp.force_encoding ('US-ASCII') +% ("", "", "# {salesperson.force_encoding ('etwas')}")

?

+0

Alles, was ich in diesen Zeilen versucht habe, hatte keine Wirkung. Ich habe versucht, alles auf US-ASCII, IBM437 und UTF-8 zu stellen, aber jedes Mal, wenn die resultierende Zeichenfolge gemischt wird, mit 16-Bit-Zeichen aus der Dateieingabe und 8-Bit-Zeichen aus den vom Programm erzeugten Daten. Interessanterweise, wenn ich nur eine Puts an die Konsole mache, zeigt es ein Leerzeichen zwischen jedem Zeichen in der Dateieingabe und keinen Abstand zwischen den Daten der angehängten Daten an. –

+2

Ich würde wahrscheinlich versuchen, einen "kleinen" reproduzierbaren Testfall und Ping-Ruby-Kern darüber zu finden. – rogerdpack

+0

Sie können auch versuchen, die aktive Codepage von der Konsole aus zu ändern, bevor Sie das Ruby-Skript mit dem 'chcp'-Befehl starten (z. B.' chcp 65001' setzt es auf UTF-8). Leider können Sie es nicht auf UTF-16 setzen, wofür ich meine Dateien in Betracht ziehen. – ewall

0

Es klingt, als kämen die CSV-Daten als UTF-16 ... daher zeigt die Puts als das druckbare Zeichen (das erste Byte) plus ein Leerzeichen (das zweite Byte).

Haben Sie versucht, Ihre angehängten Daten mit .force_encoding(Encoding::UTF-16LE) oder .force_encoding(Encoding::UTF-16BE) zu kodieren?

1

Eine kleine Notiz, die zu Ihrer Frage gehört, ist, dass Sie Ihre CSV-Daten als solche haben %(, "", "", "#{salesperson}"). Hier haben Sie ein Leerzeichen vor Ihren Anführungszeichen. Dies kann dazu führen, dass #{salesperson} als mehrere Felder interpretiert wird, wenn in diesem Text ein Komma vorhanden ist. Um dies zu beheben, darf zwischen dem Komma und den Anführungszeichen kein Leerzeichen stehen. Beispiel: "this is a field","Last, First","and so on". Dies ist ein kleiner Fehler, den ich bei der Erstellung von Berichten hatte, die in Excel angezeigt werden sollten.

In Common Format and MIME Type for Comma-Separated Values (CSV) Files beschreiben sie die Grammatik einer CSV-Datei als Referenz.