2010-02-19 39 views
6

Tôi đã xem các bài viết liên quan đến mã hóa ruby ​​/ mã hóa khác nhưng không thể tìm ra lý do tại sao những điều sau không hoạt động. Có khả năng chỉ vì tôi dày đặc, nhưng đây là tình huống.Vấn đề mã hóa chuỗi Ruby

Sử dụng Ruby 1.9 trên cửa sổ. Tôi có một tập hợp các tệp CSV cần một số dữ liệu được thêm vào cuối mỗi dòng. Bất cứ khi nào tôi chạy kịch bản của tôi, các ký tự nối thêm là vô nghĩa. Văn bản đầu vào dường như là mã hóa IBM437, trong khi chuỗi của tôi, tôi đang thêm phần bắt đầu dưới dạng US-ASCII. Không có gì tôi đã cố gắng đối với việc buộc mã hóa trên các chuỗi đầu vào hoặc chuỗi nối thêm dường như thay đổi kết quả đầu ra. Tôi bối rối. Phiên bản mã hóa hiện tại chỉ đơn giản là phiên bản cuối cùng mà tôi đã thử.

def append_salesperson(txt, salesperson) 
    if txt.length > 2 
    return txt.chomp.force_encoding('US-ASCII') + %(, "", "", "#{salesperson}") 
    end 
end 

salespeople = Hash[ 
    "fname", "Record Manager"] 

outfile = File.open("ActData.csv", "w:US-ASCII") 

salespeople.each do | filename, recordManager | 
    infile = File.open("#{filename}.txt") 
    infile.each do |line| 
    outfile.puts append_salesperson(line, recordManager) 
    end 
    infile.close 
end 
outfile.close 
+0

Bạn có đang sử dụng nhận xét ma thuật mã hóa trong tập lệnh của mình không? – kch

Trả lời

0

lẽ txt.chomp.force_encoding ('US-ASCII') +% ("", "", "# {salesperson.force_encoding ('cái gì')}")

?

+0

Mọi thứ tôi đã thử dọc theo những dòng này đều không có hiệu lực. Tôi đã cố gắng ép buộc mọi thứ vào US-ASCII, IBM437 và UTF-8 nhưng mỗi khi chuỗi kết quả được trộn lẫn, với các ký tự 16 bit từ đầu vào tệp và các ký tự 8 bit từ dữ liệu do chương trình tạo. Thật thú vị, nếu tôi chỉ làm một việc đặt vào bàn điều khiển, nó sẽ hiển thị một khoảng trống giữa mỗi ký tự trên đầu vào tệp và không có khoảng cách giữa dữ liệu trên dữ liệu được nối thêm. –

+2

Tôi có thể cố gắng tìm một trường hợp thử nghiệm có thể tái sản xuất "nhỏ" và lõi ruby ​​ping về nó. – rogerdpack

+0

Bạn cũng có thể thử thay đổi trang mã hoạt động từ bảng điều khiển trước khi khởi chạy tập lệnh Ruby, sử dụng lệnh 'chcp' (ví dụ:' chcp 65001' sẽ đặt nó thành UTF-8). Thật không may, bạn không thể đặt nó thành UTF-16, đó là những gì tôi nghĩ rằng các tập tin của bạn đang ở. – ewall

0

Có vẻ như dữ liệu CSV đang đến dưới dạng UTF-16 ... do đó các giá trị hiển thị dưới dạng ký tự có thể in (byte đầu tiên) cộng với dấu cách (byte thứ hai).

Bạn đã thử mã hóa dữ liệu được nối thêm của mình với .force_encoding(Encoding::UTF-16LE) hoặc .force_encoding(Encoding::UTF-16BE)?

1

Một lưu ý nhỏ liên quan đến câu hỏi của bạn là bạn có dữ liệu csv của mình như vậy %(, "", "", "#{salesperson}"). Ở đây bạn có một char không gian trước dấu ngoặc kép của bạn. Điều này có thể khiến cho #{salesperson} được hiểu là nhiều trường nếu có dấu phẩy trong văn bản này. Để khắc phục điều này, không thể có khoảng trắng giữa dấu phẩy và dấu ngoặc kép. Ví dụ: "this is a field","Last, First","and so on". Đây là một chút xíu mà tôi gặp phải khi tạo báo cáo có nghĩa là để được xem trong Excel.

Trong Common Format and MIME Type for Comma-Separated Values (CSV) Files, chúng mô tả ngữ pháp của tệp csv để tham khảo.