`# frozen_string_literal : true`에서 BOM이있는 CSV 파일 생성

9846 단어 bomCSVExcel루비

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를 사용하지 않게 되어 버렸습니다. . .

참고


  • Excel에서 열면 깨지는 UTF-8 CSV를 문자 코드를 변환하지 않고 여는 방법 |
  • BOM이있는 UTF-8로 깨지지 않는 CSV 출력 | Rails의 소기 | DoRuby
  • singleton method CSV.generate (Ruby 2.7.0 참조 설명서)
  • 좋은 웹페이지 즐겨찾기