ルビーのニューバードがここにいます…
「メッセージ」列のある CSV ファイル (logevents.csv) があります。 「メッセージ」列には、json データの行が含まれています。 Ruby を使用して、JSON データの名前:値のペアを 2 番目の CSV ファイルの列名:行値に変換したいと考えています。 CSV ファイルの 1 行目は次のとおりです。
メッセージ “{”“バージョン”“:”“0”“,”“id”“:”“fdd11d8a-ef17-75ae-cf50-077285bb7e15”“,”“詳細タイプ”“:”“Auth0 ログ”“,” “ソース”“:”“aws.partner/auth0.com/website-dev-c36bb924-cf05-4a5b-8400-7bdfbfe0806c/auth0.logs”“,”“アカウント”“:”“654654277766”“,”“時間”“:”“2024-03-27T12:30:51Z”“,”“リージョン”“:”“us-east-2”“,”“リソース”“:[],”“詳細”“:{” “log_id”“:”“90020240327123051583073000000000000001223372067726119722”“,”“data”“:{”“date”“:”“2024-03-27T12:30:51.531Z”“,”“type”“:”“seacft”” ,““説明”“:”“““,”“接続ID”“:”“““,”“クライアントID”“:”“v00a8B5f1sgCDjVhneXMbMmwxlsbYoHq”“,”“クライアント名”“:”“ウェブサイト開発”“,”” ip”“:”“32.174.36.217”“,”“user_agent”“:”“いつか v1.10.3”“,”“詳細”“:{”“コード”“:”“******** **********************************5kW”“},”“ホスト名”“:”“website-dev .us.auth0.com”“,”“user_id”“:”“auth0|648a230ee5ad48ee2ebfb212”“,”“user_name”“:”“[email protected]”“,”“auth0_client”“:{”“name”” :““omniauth-auth0”“,”“バージョン”“:”“2.6.0”“,”“env”“:{”“ruby”“:”“2.6.5”“,”“rails”“:”“6.1.7.4”“}},”“““:{”“バージョン”“:”“1.0.0”“},”“log_id”“:”“90020240327123051583073000000000000001223372067726119722”“}}}”
各行について、上記を別の CSV ファイルに書き込む必要がありますが、名前:値のペアを列名と行の値の区切り文字として「,」(カンマ)を使用して列:行値にピボットします。
バージョン、ID、詳細タイプ、ソース、アカウント ….など 0、fdd11d8a-ef17-75ae-cf50-077285bb7e15、Auth0 ログ、aws.partner/auth0.com/website-dev-c36bb924-cf05-4a5b-8400-7bdfbfe0806c/auth0.logs、654654277766 ….etc
私はこの Ruby スクリプト (runtimetest.rb) を介してこれを達成しようとしています。
require 'csv'
require 'json'
CSV.open("C:/Ruby/dev/logevents2.csv", "w") do |csv| #open new file for write
JSON.parse(File.open("C:/Ruby/dev/logevents.csv").read).each do |hash| #open json to parse
csv << hash.values #write value to file
end
end
ただし、実行時に CSV ファイルの内容 (logevents.csv) が「予期しないトークン」というメッセージとともに画面に書き込まれます。
C:>runtimetest.rb
C:>runtimetest.rb
これを試してみました。私はこの Ruby スクリプト (runtimetest.rb) を介してこれを達成しようとしました。
require 'csv'
require 'json'
CSV.open("C:/Ruby/dev/logevents2.csv", "w") do |csv| #open new file for write
JSON.parse(File.open("C:/Ruby/dev/logevents.csv").read).each do |hash| #open json to parse
csv << hash.values #write value to file
end
end
出力が2番目のCSVの列、行テーブルであることを期待していました:
バージョン、ID、詳細タイプ、ソース、アカウント ….など 0、fdd11d8a-ef17-75ae-cf50-077285bb7e15、Auth0 ログ、aws.partner/auth0.com/trulab-dev-c36bb924-cf05-4a5b-8400-7bdfbfe0806c/auth0.logs、654654277766 ….etc
私はこの件について全く間違っているかもしれない。 ご提案をお待ちしております。
よろしくお願いします、 ドナルド
Ruby で単一レコードの JSON ファイルを解析して、JSON 名と値のペア (ネストされたペアも) をヘッダーと行 .csv ファイルとして 2 番目のファイルに書き込むことができました。
require 'csv'
require 'json'
# An attempt to figure out what a row will look like
def array_from(json)
queue, next_item = [], json
while !next_item.nil?
return next_item if next_item.is_a? Array
if next_item.is_a? Hash
next_item.each do |k, v|
queue.push next_item[k]
end
end
next_item = queue.shift
end
return [json]
end
# try to build header columns for the nested elements
def flatten(object, path='')
scalars = [String, Integer, FalseClass, TrueClass]
columns = {}
if [Hash, Array].include? object.class
object.each do |k, v|
new_columns = flatten(v, "#{path}#{k}|") if object.class == Hash
new_columns = flatten(k, "#{path}#{k}|") if object.class == Array
columns = columns.merge new_columns
end
return columns
elsif scalars.include? object.class
# Remove trailing slash from path
end_path = path[0, path.length - 1]
columns[end_path] = object
return columns
else
return {}
end
end
json = JSON.parse(File.open('logevent.json').read)
in_array = array_from json
out_array = []
in_array.each do |row|
out_array[out_array.length] = flatten row
end
headers_written = false
CSV.open('logevent.csv', 'w') do |csv|
out_array.each do |row|
csv << row.keys && headers_written = true if headers_written === false
csv << row.values
end
end
入力ファイル「logevent.json」の内容は次のとおりです。
{
"Message": [
{
"version": "0",
"id": "fdd11d8a-ef17-75ae-cf50-077285bb7e15",
"detail-type": "Auth0 log",
"source": "aws.partner/auth0.com/website-c36bb924-cf05-4a5b-8400-7bdfbfe0806c/auth0.logs",
"account": "654654277766",
"time": "2024-03-27T12:30:51Z",
"region": "us-east-2",
"resources": [],
"detail": {
"log_id": "90020240327123051583073000000000000001223372067726119722",
"data": {
"date": "2024-03-27T12:30:51.531Z",
"type": "seacft",
"description": "",
"connection_id": "",
"client_id": "v00a8B5f1sgCDjVhneXMbMmwxlsbYoHq",
"client_name": "Website Dev",
"ip": "3.17.36.227",
"user_agent": "JohnDoe v1.10.3",
"details": {
"code": "******************************************5kW"
},
"hostname": "website.us.auth0.com",
"user_id": "auth0|648a230ee5ad48ee2ebfb212",
"user_name": "[email protected]",
"auth0_client": {
"name": "omniauth-auth0",
"version": "2.6.0",
"env": {
"ruby": "2.6.5",
"rails": "6.1.7.4"
}
},
"$event_schema": {
"version": "1.0.0"
},
"log_id": "90020240327123051583073000000000000001223372067726119722"
}
}
}
]
}
アップデート Ruby で単一レコードの JSON ファイルを解析して、JSON 名と値のペア (ネストされたペアも) をヘッダーと行 .csv ファイルとして 2 番目のファイルに書き込むことができました。
「csv」が必要です 「json」が必要です