Konvertieren Sie TSV-Dateien in das JSON-Format und JSON in TSV-Dateien
Ruby 2.6.5 Mac OS 10.15.5
[{"name":"john","gender":"m","age":"18"},
{"name":"paul","gender":"m","age":"20"},
{"name":"alice","gender":"f","age":"15"},
{"name":"dabid","gender":"m","age":"17"},
{"name":"jasmin","gender":"f","age":"17"}]
Name gender age
john m 18
paul m 20
alice f 15
dabid m 17
jasmin f 17
erfordern "json" # Beschrieben, um JSON zu behandeln
File.open("meibo.json") do |json| #Öffnen Sie die JSON-Datei
File.open("meibo.txt", "w") do |txt| #Öffnen Sie die TSV-Ausgabedatei
array = JSON.load (json) # JSON laden
column = ["Name", "Geschlecht", "Alter"] # Header
txt.puts (column.join ("\ t")) # Header einfügen
array.each do |line| #Fügen Sie jedes Element des JSON-Arrays in jede Zeile der TSV-Datei ein
attr = [line["name"],line["gender"],line["age"]]
txt.puts(attr.join("\t"))
end
end
end
Öffnen Sie zunächst die JSON-Datei. Öffnen Sie auch die Ausgabeziel-TSV-Datei im Schreibmodus. Lesen Sie als Nächstes die JSON-Datei. Wie unten gezeigt, liest JSON eine JSON-Datei mit "JSON.load ([Dateiobjekt])" und gibt sie als Array mit Hashes als Elementen zurück.
require "json"
File.open("meibo.json") do |json|
array = JSON.load(json)
p array
end
=>
[{"name"=>"john", "gender"=>"m", "age"=>"18"}, {"name"=>"paul", "gender"=>"m", "age"=>"20"}, {"name"=>"alice", "gender"=>"f", "age"=>"15"}, {"name"=>"dabid", "gender"=>"m", "age"=>"17"}, {"name"=>"jasmin", "gender"=>"f", "age"=>"17"}]
Es ist ein Bild, in dem das zurückgegebene Array mit der Methode "each" gedreht und jeder Hash zeilenweise in TSV erstellt wird. Die Technik, die in jede Zeile von TSV eingefügt wird, besteht darin, den Wert jedes von "jedem" herausgenommenen Hashs durch direkte Angabe des Schlüssels herauszunehmen und sie einmal wieder in das Array einzufügen. Verwenden Sie dann die Join-Methode, um die Arrays mit Tabulatortrennzeichen zu verbinden und die Zeichenfolge in jede Zeile der TSV-Datei einzufügen.
Das Ausgabeergebnis ist wie folgt.
name gender age
john m 18
paul m 20
alice f 15
dabid m 17
jasmin f 17
Wie unten gezeigt, wurde das Array nach dem Senden von "JSON.load" an "jede" Verarbeitung zunächst in der Reihenfolge der Werte jedes Objekts in TSV gespeichert. ** Die Reihenfolge der JSON-Mitglieder (Schlüssel- und Wertesätze) spielt keine Rolle **.
Das heißt, "{" Name ":" John "," Geschlecht ":" m "," Alter ":" 18 "}" und "{" Name ":" John "," Alter ":" 18 "," Geschlecht " : "m"} `ist nicht zu unterscheiden.
Daher ist es diesmal kein Problem, wenn Sie gemäß der Reihenfolge der Mitglieder von JSON in TSV konvertieren. Wenn die Reihenfolge der Mitglieder jedoch unterschiedlich ist, ist es seltsam, wenn Sie in TSV konvertieren. Es war.
Es ist also ein Ärger, aber wenn Sie den Wert durch Angabe des Hash-Schlüssels herausnehmen, ihn in der Reihenfolge der Spalten in das Array einfügen und dann in den TSV einfügen, ist dies sicher.
require "json"
File.open("meibo.json") do |json|
File.open("meibo.txt", "w") do |txt|
array = JSON.load(json)
column = ["name","gender","age"]
txt.puts(column.join("\t"))
array.each do |line|
txt.puts (line.values.join ("\ t")) #Geben Sie in TSV entsprechend der Wertesequenz jedes Objekts in JSON ein
end
end
end
require "json"
require "csv"
hash_ary = []
File.open("meibo.json","w") do |json|
CSV.foreach("meibo.txt",col_sep: "\t", headers: true) do |line|
h = {name: line[0], gender: line[1], age: line[2]}
hash_ary << h
end
Verwenden Sie JSON.dump (hash_ary, json) #to_json
end
Bereiten Sie zunächst eine Datei zum Schreiben von JSON im Schreibmodus vor.
Die TSV-Datei ist eine CSV-Klasse, die die Methode "foreach" verwendet, um jede Zeile in einen Hash zu konvertieren. Fügen Sie den konvertierten Hash einmal in ein Array ein (in diesem Fall "hash_ary"). Nachdem alle Zeilen eingefügt wurden, konvertieren Sie den Hash mit "JSON.dump" in JSON und schreiben Sie ihn in die Datei.
Das Ausgabeergebnis ist wie folgt.
[{"name":"john","gender":"m","age":"18"},{"name":"paul","gender":"m","age":"20"},{"name":"alice","gender":"f","age":"15"},{"name":"dabid","gender":"m","age":"17"},{"name":"jasmin","gender":"f","age":"17"}]
require "json"
require "csv"
hash_ary = []
File.open("meibo.json","w") do |json|
CSV.foreach("meibo.txt",col_sep: "\t", headers: true) do |line|
h = {name: line[0], gender: line[1], age: line[2]}
hash_ary << h.to_json
end
json << hash_ary
end
Zuerst wurde es wie oben geschrieben, aber wenn Sie es so machen. ..
["{\"name\":\"john\",\"gender\":\"m\",\"age\":\"18\"}", "{\"name\":\"paul\",\"gender\":\"m\",\"age\":\"20\"}", "{\"name\":\"alice\",\"gender\":\"f\",\"age\":\"15\"}", "{\"name\":\"dabid\",\"gender\":\"m\",\"age\":\"17\"}", "{\"name\":\"jasmin\",\"gender\":\"f\",\"age\":\"17\"}"]
Wie Sie sehen können, wurde "" vor "" eingefügt und konnte nicht erfolgreich konvertiert werden.
Die Methode "to_json" wird als JSON-formatierte ** Zeichenfolge ** zurückgegeben. Die Verwendung von "JSON.dump" anstelle des Problems löste das Problem.
Recommended Posts