Convertir les fichiers TSV au format JSON et JSON en fichiers TSV
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
require "json" # Décrit pour gérer JSON
File.open("meibo.json") do |json| #Ouvrez le fichier JSON
File.open("meibo.txt", "w") do |txt| #Ouvrez le fichier TSV de sortie
array = JSON.load (json) #Load JSON
column = ["name", "gender", "age"] # en-tête
txt.puts (column.join ("\ t")) # Insérer un en-tête
array.each do |line| #Placez chaque élément du tableau JSON sur chaque ligne du fichier TSV
attr = [line["name"],line["gender"],line["age"]]
txt.puts(attr.join("\t"))
end
end
end
Tout d'abord, ouvrez le fichier JSON. Ouvrez également le fichier TSV de destination de sortie en mode écriture.
Ensuite, lisez le fichier JSON. Comme indiqué ci-dessous, JSON lit un fichier JSON avec JSON.load ([File object])
et le renvoie sous forme de tableau avec des hachages comme éléments.
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"}]
C'est une image de rotation du tableau retourné avec la méthode ʻeach et de création de chaque hachage ligne par ligne dans TSV. La technique à mettre dans chaque ligne de TSV est de retirer la valeur de chaque hachage retiré par ʻeach
en spécifiant directement la clé, et de les remettre une fois dans le tableau. Ensuite, utilisez la méthode join
pour joindre les tableaux avec des délimiteurs de tabulation et insérez la chaîne dans chaque ligne du fichier TSV.
Le résultat de sortie est le suivant.
name gender age
john m 18
paul m 20
alice f 15
dabid m 17
jasmin f 17
Au début, comme indiqué ci-dessous, lorsque le tableau après JSON.load
était envoyé au traitement ʻeach`, il était stocké dans TSV dans l'ordre des valeurs de chaque objet.
** L'ordre des membres JSON (ensembles de clés et de valeurs) n'a pas d'importance **.
C'est-à-dire: {" name ":" john "," gender ":" m "," age ":" 18 "}
et `{" name ":" john "," age ":" 18 "," gender " : "m"} ʻest indiscernable.
Par conséquent, cette fois, il arrive qu'il n'y ait pas de problème si vous convertissez en TSV selon l'ordre des membres de JSON, mais si l'ordre des membres est différent, ce sera étrange lorsque vous convertissez en TSV. C'était.
Donc, c'est un problème, mais une fois que vous retirez la valeur en spécifiant la clé de hachage, mettez-la dans le tableau dans l'ordre des colonnes, puis mettez-la dans le TSV, c'est sûr.
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")) # Entrez dans TSV en fonction de la séquence de valeurs de chaque objet dans JSON
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
Utilisez JSON.dump (hash_ary, json) #to_json
end
Tout d'abord, préparez un fichier pour l'écriture de JSON en mode écriture.
Le fichier TSV est une classe CSV qui utilise la méthode foreach
pour convertir chaque ligne en un hachage. Mettez le hachage converti dans un tableau (hash_ary
dans ce cas) une fois, et après que toutes les lignes ont été insérées, convertissez le hachage en JSON avec JSON.dump
et écrivez-le dans le fichier.
Le résultat de sortie est le suivant.
[{"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
Au début, c'était écrit comme ci-dessus, mais si vous le faites comme ça. ..
["{\"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\"}"]
Comme vous pouvez le voir, «\» a été inséré avant «» et il n'a pas pu être converti avec succès.
La méthode to_json
renvoie une ** chaîne ** au format JSON, donc utiliser JSON.dump
au lieu de cela a résolu le problème.
Recommended Posts