Ich habe die Funktion implementiert, um die von Rails erstellte CSV neulich auf S3 hochzuladen. Ich hatte mehr Rücksicht als ich erwartet hatte, also werde ich den Inhalt zusammenfassen.
Rails 5.2.3 Ruby 2.6.3
Ich erwarte nicht, CSV in Excel zu überprüfen
Sie müssen das Gem installieren, um über Rails auf AWS zugreifen zu können. Fügen Sie Ihrem Gemfile Folgendes hinzu:
Gemfile
gem 'aws-sdk', '~> 3'
Ich wollte die diesmal erstellte CSV-Ausgabefunktion als allgemeine Logik verwenden. Erstellen Sie daher eine Datei mit dem Namen "output_csv.rb" in "/ app / lib". Definieren Sie die Klasse in output_csv.rb wie folgt. Alle Methoden dieser Klasse sollten Klassenmethoden sein.
app/lib/output_csv.rb
require 'csv'
require 'nkf'
class OutputCsv
class << self
#Fügen Sie hier Methoden hinzu
end
end
Erstellen Sie eine Methode zur Ausgabe an S3. Die als Parameter empfangene CSV-Zeichenfolge wird an S3 ausgegeben. Der Teil zur Erstellung von CSV-Zeichenfolgen wird später beschrieben.
app/lib/output_csv.rb
#CSV-Ausgabemethode-- ①
def save_csv(data)
#Der Dateiname lautet'Zufällige Zeichenfolge_Zeitstempel.csv'Zu
file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
#Ausgabe in einen Ordner namens csv direkt unter dem Bucket
file_full_path = "csv/#{file_name}"
#CSV-Ausgabe lokal in der Entwicklungsumgebung und an S3 in der Produktionsumgebung-- ②
if Rails.env.development?
File.open(Rails.root.join('tmp', file_name), 'w') do |f|
#Konvertieren Sie den Zeichencode mit NKF-- ③
f.puts(NKF.nkf('-x -w', data))
end
else
#S3-Client-Instanziierung-- ④
s3 = Aws::S3::Client.new
#CSV an S3 ausgeben-- ⑤
s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
key: file_full_path,
body: NKF.nkf('-x -w', data),
content_type: 'text/csv')
end
end
(1) Definition der CSV-Ausgabemethode. Empfängt die CSV-Zeichenfolge, die als Parameter (Daten) ausgegeben werden soll.
def save_csv(data)
(2) Dieses Mal erfolgt die Ausgabe lokal in der Entwicklungsumgebung und an S3 in der Produktionsumgebung. Wenn Sie auch in der Entwicklungsumgebung in S3 ausgeben möchten, ist dieser Zweig nicht erforderlich.
③ NKF wird zum Konvertieren der Zeichenfolge verwendet.
f.puts(NKF.nkf('-x -w', data))
Die ersten Argumente -x und -w geben die folgenden Konvertierungen an. -x: Ausgabe ohne Konvertierung von Katakana halber Breite in Katakana voller Breite -w: Ausgabe mit utf-8
(4) Erstellen einer Instanz des S3-Clients. Verwenden Sie diese Option, um auf S3 zuzugreifen.
s3 = Aws::S3::Client.new
Beachten Sie, dass wir hier keine Parameter an den Konstruktor übergeben haben. Der Grund dafür ist, dass die Rolle der EC2-Instanz, auf der diese Rails-Anwendung ausgeführt wird, über die Berechtigung zum Schreiben in S3 verfügt, sodass die Berechtigung nicht berücksichtigt werden muss.
Wenn Sie auf S3 mit IAM-Benutzerrechten anstelle von Rollen zugreifen möchten, müssen Sie den Zugriffsschlüssel und den geheimen Schlüssel wie unten gezeigt angeben.
s3 = Aws::S3::Client.new(
access_key_id: 'your_access_key_id',
secret_access_key: 'your_secret_access_key'
)
⑤ Erstellen Sie eine CSV-Datei in S3.
s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
key: file_full_path,
body: NKF.nkf('-x -w', data),
content_type: 'text/csv')
Ich benutze eine Methode namens put_object. Der Inhalt jedes Parameters ist wie folgt.
-Bucket: Der Name des auszugebenden Buckets. Hier basiert die Beschreibung auf der Annahme, dass die Umgebungsvariable "AWS_S3_BUCKET" gesetzt ist. -Taste: Geben Sie den Namen des Ausgabeverzeichnisses + den Dateinamen an. -Körper: Gibt die oben erläuterte Zeichenfolge aus, die von NKF konvertiert wurde. -Inhaltstyp: Das Dateiformat wird angegeben. Wenn Sie hier nicht explizit angeben, dass es sich um eine CSV-Datei handelt, wird sie in S3 nicht als CSV-Datei erkannt.
Erstellen Sie eine CSV-Zeichenfolge, übergeben Sie die erstellte Zeichenfolge an die oben erstellte Methode save_csv und erstellen Sie eine Methode zur Ausgabe einer CSV-Datei.
Die zu erstellende Methode empfängt Header- und Datenelemente als Parameter, konvertiert sie in CSV-Zeichenfolgen und gibt sie als Datei aus.
app/lib/output_csv.rb
#Methode zur Erstellung von CSV-Zeichenfolgen-- ①
def execute(headers, values)
output = CSV.generate do |csv|
#Header-Ausgabe-- ②
csv << headers
#Ausgabe von Datenelementen-- ③
values.each do |value|
csv << value
end
end
#CSV-Dateiausgabe-- ④
save_csv(output)
end
(1) Definition der Methode zur Erstellung von CSV-Zeichenfolgen. Empfängt ein Array von Headern und Datenelementen als Parameter. Zum Beispiel, wenn Sie die folgende CSV erstellen möchten
id,name,age
1,hoge,20
2,fuga,31
3,foo,43
Erstellen Sie ein Array wie das folgende und übergeben Sie es an die Parameter.
#Header
headers = ['id', 'name','age']
#Datenelement
values = []
values.push([1, 'hoge', 20])
values.push([2, 'fuga', 31])
values.push([3, 'foo', 43])
OutputCsv.execute(headers, values)
(2) Der Wert des vom Parameter empfangenen Headers wird in CSV eingestellt.
(3) Das vom Parameter empfangene Datenelement wird in CSV eingestellt. Da es sich um ein Array handelt, wird es Zeile für Zeile herausgenommen und festgelegt.
(4) Übergeben Sie die erstellte CSV-Zeichenfolge an die oben erstellte Methode save_csv und geben Sie sie an S3 aus.
Der gesamte Code ist unten. Die save_csv-Methode sollte nicht von außen aufgerufen werden, daher wird sie privat gemacht.
app/lib/output_csv.rb
require 'csv'
require 'nkf'
class OutputCsv
class << self
def execute(headers, values)
output = CSV.generate do |csv|
#Header-Ausgabe
csv << headers
#Ausgabe von Datenelementen
values.each do |value|
csv << value
end
end
#CSV-Dateiausgabe
save_csv(output)
end
private
def save_csv(data)
#Der Dateiname lautet'Zufällige Zeichenfolge_Zeitstempel.csv'
file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
#
file_full_path = "csv/#{file_name}"
#
if Rails.env.development?
File.open(Rails.root.join('tmp', file_name), 'w') do |f|
#
f.puts(NKF.nkf('-x -w', data))
end
else
#
s3 = Aws::S3::Client.new
#
s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
key: file_full_path,
body: NKF.nkf('-x -w', data),
content_type: 'text/csv')
end
end
end
end
Geben Sie die Datei in S3 aus.
headers = ['id', 'name','age']
values = []
values.push([1, 'AIUEO', 20])
values.push([2, 'Kakikukeko', 31])
values.push([3, 'SA Shi Su Se So.', 43])
OutputCsv.execute(headers, values)
Die CSV-Datei wird wie unten gezeigt in den angegebenen Bucket und das angegebene Verzeichnis ausgegeben.
Wenn Sie die Dateiausgabe in S3 herunterladen und den Inhalt überprüfen, sieht dies wie folgt aus.
Recommended Posts