`# frozen_string_literal : true`에서 BOM이있는 CSV 파일 생성
CSV를 Excel에서 열려면 BOM을 붙이면 좋다.
UTF-8 CSV 파일에서도 BOM을 붙이면 Excel에서 열 수 있습니다. 라는 것을 어제 알았습니다!
Ruby에서 샘플을 작성해 보겠습니다.
with_bom_csv.rb# frozen_string_literal: true
require 'csv'
File.open('with_bom.csv', 'w:UTF-8') do |file|
bom = "\uFEFF"
headers = ['id', 'first name', 'last name', 'age']
csv_data = CSV.generate(+bom, headers: headers, write_headers: true) do |csv|
csv << ['1', '太郎', '田中', '20']
csv << ['2', '次郎', '鈴木', '18']
csv << ['3', '亜海', '佐藤', '19']
csv << ['4', '祐実', '安達', '21']
csv << ['5', '三郎', '近藤', '34']
end
file.write(csv_data)
end
CSV 파일의 내용은 CSV.generate 참조 매뉴얼을 한자로 다시 작성했습니다.
주의사항
# frozen_string_literal: true
를 파일의 선두에 붙여 있어, 캐릭터 라인이 동결되므로, CSV.generate에 건네주는 bom을 +bom
라고 써 해동하고 있습니다. 압축해제를 잊으면 not opened for writing (IOError)
로 에러가 되어 버립니다.
코멘트를 받아 추기 (2020-01-09 14:19)
좀 더 적절한 형태로 다시 작성해 보았습니다.
with_bom_csv.rb# frozen_string_literal: true
require 'csv'
BOM = "\uFEFF"
headers = ['id', "first\nname", "last\nname", 'age']
data = [
{ id: '1', first_name: '太郎', last_name: '田中', age: '20' },
{ id: '2', first_name: '次郎', last_name: '鈴木', age: '18' },
{ id: '3', first_name: '亜海', last_name: '佐藤', age: '19' },
{ id: '4', first_name: '祐実', last_name: '安達', age: '21' },
{ id: '5', first_name: '三郎', last_name: '近藤', age: '34' }
]
File.open('with_bom.csv', 'w:UTF-8') do |file|
file.write BOM
csv = CSV.new(file, headers: headers, write_headers: true)
data.each do |row|
csv << [row[:id], row[:first_name], row[:last_name], row[:age]]
end
end
현실의 CSV 출력을 이미지하여 데이터를 루프로 출력하는 형태로 했습니다.
CSV 파일의 내용을 일시적인 문자열로서 작성하면, 거대해질 우려도 있으므로, 파일 출력의 형태로 바꾸어 보았습니다.
BOM을 붙이면 Excel에서 열린다는 이야기였습니다만, 실은 개행을 포함하고 있어도 적절하게 열 수 있다는 점도 메리트입니다. 그것을 표현하기 위해 일부러 개행 코드를 넣어 보았습니다.
원래는, 「CSV.generate에 건네주는 캐릭터 라인이 동결되어 있으면 에러가 되므로 주의!」라고 하는 생각으로 쓴 엔트리였지만, CSV.generate를 사용하지 않게 되어 버렸습니다. . .
참고
# frozen_string_literal: true
require 'csv'
File.open('with_bom.csv', 'w:UTF-8') do |file|
bom = "\uFEFF"
headers = ['id', 'first name', 'last name', 'age']
csv_data = CSV.generate(+bom, headers: headers, write_headers: true) do |csv|
csv << ['1', '太郎', '田中', '20']
csv << ['2', '次郎', '鈴木', '18']
csv << ['3', '亜海', '佐藤', '19']
csv << ['4', '祐実', '安達', '21']
csv << ['5', '三郎', '近藤', '34']
end
file.write(csv_data)
end
# frozen_string_literal: true
를 파일의 선두에 붙여 있어, 캐릭터 라인이 동결되므로, CSV.generate에 건네주는 bom을 +bom
라고 써 해동하고 있습니다. 압축해제를 잊으면 not opened for writing (IOError)
로 에러가 되어 버립니다.코멘트를 받아 추기 (2020-01-09 14:19)
좀 더 적절한 형태로 다시 작성해 보았습니다.
with_bom_csv.rb# frozen_string_literal: true
require 'csv'
BOM = "\uFEFF"
headers = ['id', "first\nname", "last\nname", 'age']
data = [
{ id: '1', first_name: '太郎', last_name: '田中', age: '20' },
{ id: '2', first_name: '次郎', last_name: '鈴木', age: '18' },
{ id: '3', first_name: '亜海', last_name: '佐藤', age: '19' },
{ id: '4', first_name: '祐実', last_name: '安達', age: '21' },
{ id: '5', first_name: '三郎', last_name: '近藤', age: '34' }
]
File.open('with_bom.csv', 'w:UTF-8') do |file|
file.write BOM
csv = CSV.new(file, headers: headers, write_headers: true)
data.each do |row|
csv << [row[:id], row[:first_name], row[:last_name], row[:age]]
end
end
현실의 CSV 출력을 이미지하여 데이터를 루프로 출력하는 형태로 했습니다.
CSV 파일의 내용을 일시적인 문자열로서 작성하면, 거대해질 우려도 있으므로, 파일 출력의 형태로 바꾸어 보았습니다.
BOM을 붙이면 Excel에서 열린다는 이야기였습니다만, 실은 개행을 포함하고 있어도 적절하게 열 수 있다는 점도 메리트입니다. 그것을 표현하기 위해 일부러 개행 코드를 넣어 보았습니다.
원래는, 「CSV.generate에 건네주는 캐릭터 라인이 동결되어 있으면 에러가 되므로 주의!」라고 하는 생각으로 쓴 엔트리였지만, CSV.generate를 사용하지 않게 되어 버렸습니다. . .
참고
# frozen_string_literal: true
require 'csv'
BOM = "\uFEFF"
headers = ['id', "first\nname", "last\nname", 'age']
data = [
{ id: '1', first_name: '太郎', last_name: '田中', age: '20' },
{ id: '2', first_name: '次郎', last_name: '鈴木', age: '18' },
{ id: '3', first_name: '亜海', last_name: '佐藤', age: '19' },
{ id: '4', first_name: '祐実', last_name: '安達', age: '21' },
{ id: '5', first_name: '三郎', last_name: '近藤', age: '34' }
]
File.open('with_bom.csv', 'w:UTF-8') do |file|
file.write BOM
csv = CSV.new(file, headers: headers, write_headers: true)
data.each do |row|
csv << [row[:id], row[:first_name], row[:last_name], row[:age]]
end
end
Reference
이 문제에 관하여(`# frozen_string_literal : true`에서 BOM이있는 CSV 파일 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Akiyah/items/11edd64beed301f9f485텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)