2012-06-29 20 views
6

Trong bộ tách tiếng Đức thập phân, và bộ tách giá trị là ";" . Bằng tiếng Anh/các ngôn ngữ khác, các bộ phân tách thập phân là. và giá trị seperators là ",".ghi tệp .csv - độc lập với văn hóa

Tôi muốn tạo tệp indepedent .csv của văn hóa hiện tại. Tôi có nghĩa là luôn luôn tệp .csv phải có "." có dấu phân cách thập phân và "," có giá trị phân tách.

Mã cho điều này được cung cấp bên dưới.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Globalization; 

namespace CSV_FILE_FORMAT 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string aFileName = "result.csv"; 
      FileStream aFileStream = new FileStream(aFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); 
      StreamWriter m_StreamWriter = new StreamWriter(aFileStream); 
      double[] values = new double[] { 10.5, 20.3, 30.2 }; 
      for(int i = 0; i < values.Length;i++) 
      { 
       m_StreamWriter.Write(values[i].ToString(CultureInfo.InvariantCulture)); 
       m_StreamWriter.Write(","); 
      } 
     } 
    } 
} 

Vấn đề với mã này là nếu OS là tiếng Đức. Trình phân tách thập phân được hiển thị "," thay vì ".".

Vui lòng cho tôi biết mã thiếu cái gì đó.

+2

_ "Vấn đề với mã này là nếu hệ điều hành là tiếng Đức. Các dấu tách thập phân được hiển thị", "thay vì". "." _ Điều đó cần được ngăn chặn bằng cách sử dụng 'CultureInfo.InvariantCulture'. Vì vậy, phải có một số khác tôi đang bỏ qua được nêu ra. –

+0

m_StreamWriter.Write (giá trị [i] .ToString (CultureInfo.InvariantCulture)); Tôi đang sử dụng culture.invariantculture. nhưng tôi vẫn không thể có được giá trị phù hợp. – Raghav55

+1

Mã được cung cấp hoạt động tốt (ngoại trừ đóng tài nguyên ;-)) trên hệ điều hành của Đức (Windows 7) và các cặp đôi được tạo thành với một điểm "." như mong đợi bởi các bình luận. Ngay cả khi cài đặt văn hóa được đặt thành ",". –

Trả lời

2

Giải pháp nhanh chóng để giải quyết vấn đề văn hóa Đức là nhúng các giá trị kép đó với dấu ngoặc kép. Kết quả:

English: "10.5","20.3","30.2" 
German: "10,5","20,3","30,2" 

http://en.wikipedia.org/wiki/Comma-separated_values

+0

IMHO, đây sẽ là giải pháp tốt hơn, kết hợp với các trình phân tích cú pháp CSV – Indy9000

+2

Phiên bản Excel của Đức hy vọng ';' sẽ được sử dụng làm dấu phân cách. – Joey

+0

Nó phụ thuộc rất nhiều vào phần người đọc: tiếng Đức hoặc bất biến. –

1

Không có giải pháp dễ dàng cho vấn đề này: CSV là không một định nghĩa định dạng tập tin (mặc dù RFC 4180).

Excel, làm ví dụ, đọc và lưu csv bằng cách sử dụng trình tách danh sách được bản địa hóa và định dạng dữ liệu được bản địa hóa do người dùng đặt. Bằng cách này, "Dấu phẩy" trong CSV không có nghĩa là dấu phẩy, nhưng dấu tách danh sách chung (đối với nhiều quốc gia EU, đây là dấu chấm phẩy, như Tim Schmelter đã nói).

Nếu các giá trị được đặt trong dấu ngoặc kép, chúng thường được coi là chuỗi. Excel cố gắng phân tích cú pháp các phần tử được trích dẫn của hàng CSV, vì vậy, điều này có vẻ như hoạt động trong các trường hợp rất đặc biệt.

Vấn đề là cả nhà văn và người đọc tệp CSV nên sử dụng cùng một nền văn hóa, nếu không vấn đề sẽ phát sinh với gần như mọi thứ không phải là chuỗi (số là một, ngày/giờ là một nguồn khác).

Tôi sử dụng giải pháp có nguồn gốc thực nghiệm cho các ngày, bao gồm chuỗi định dạng yyyy/MM/dd HH:mm:ss. Tôi quan sát thấy nó cho phép trao đổi ngày làm việc giữa Excel và các chương trình của tôi, thay thế bằng tiếng Anh hoặc tiếng Ý.

Tôi vẫn chưa tìm thấy giải pháp phổ dụng cho số thập phân. Tôi nghi ngờ ký hiệu khoa học có thể làm, nhưng không có thời gian để kiểm tra.

6

Có thể bạn có thể nhận dấu tách thập phân và dấu phân tách danh sách từ văn hóa hiện tại.

CultureInfo culture = new CultureInfo(currentCultureName); 
string decimalSeparator = culture.NumberFormat.NumberDecimalSeparator; 
string listSeparator = culture.TextInfo.ListSeparator; 

Và, nếu giá trị được viết có chứa bất kỳ dấu phân cách nào, kèm theo giá trị trong dấu ngoặc kép.

string val = values[i].ToString(CultureInfo.InvariantCulture); 
if(val.Contains(decimalSeparator) || val.Contains(listSeparator)) 
{ 
    val = string.Format("\"{0}\"", val); 
} 
m_StreamWriter.Write(val); 
m_StreamWriter.Write(listSeparator); 

Tên văn hóa hiện tại có thể giống như sau: "en-US" cho Hoa Kỳ.

Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan