如何在csv文件中读取波斯语c#

时间:2015-04-28 08:19:07

标签: c#

我想阅读一个简单的CSV文件,用逗号分隔此代码:

 var reader = new StreamReader(File.OpenRead(@"d:\34.csv"));


List<string> listA = new List<string>();
        List<string> listB = new List<string>();
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(',');

            listA.Add(values[0]);
            listB.Add(values[1]);
        }
        MessageBox.Show("READ IT!!!");

但是当我读取文件调试代码时,注意不能读波斯语或阿拉伯语字符!我怎么解决这个问题?我认为我的文件无效编码?

3 个答案:

答案 0 :(得分:0)

如果您的CSV文件只包含一行,则ReadToEnd可以接受,但如果您有一个由多行组成的日志文件,那么最好使用StreamReader对象的ReadLine逐行读取

link for true answer and more information

 using (StreamReader sr = new StreamReader("c:/temp/34.csv"))
    {
        string currentLine;
        // currentLine will be null when the StreamReader reaches the end of file
        while((currentLine = sr.ReadLine()) != null)
        {
            // Search, case insensitive, if the currentLine contains the searched keyword
            if(currentLine.IndexOf("I/RPTGEN", StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                 Console.WriteLine(currentLine);
            }

        }
    }

More information

答案 1 :(得分:0)

您可以为CSV的每一行创建一个由get和set组成的类。然后,您可以实例化对象列表以检索CSV行。 试试这个:

class Program
{

static void Main(string[] args)
{

var reader = new StreamReader(File.OpenRead(@"YourCSV"),Encoding.Unicode);

 List<Customer> customer = new List<Customer>();

 while (!reader.EndOfStream)
 {
    Customer c = new Customer
    {
        m_line1 = null,
        m_line2 = null,
    };

     var line = reader.ReadLine();
     var tokens = line.Split(',');

     c.m_line1 = tokens[0];
     c.m_line2 = tokens[1];
     customer.Add(c);

 }

   foreach(var s in customer)
   {
      Console.Writline(s);
      Console.Readline();
   }
}
}



class Customer
{
   private string line1;
   public string m_line1
   {
   get
   {
     return line1;
   }

  set
  {
    line1= value;
  }
}

private string line2;
public string m_line2
{
  get
  {
    return line2;
  }

  set
  {
    line2= value;
  }
}

答案 2 :(得分:0)

您必须将字符编码传递给StreamReader构造函数。 没有纯文本这样的东西。阅读文本需要知道其编码。

该行

using (StreamReader sr = new StreamReader("c:/temp/34.csv"))

应该是

using (StreamReader sr = new StreamReader("c:/temp/34.csv"), myencoding)
myccoding是什么只有你能知道的东西。使用什么编码保存文件?这就是你需要的编码。如果该文件是在Windows上生成的,并且有教育的猜测最可能的编码将是UTF-16LE。该编码可用Encoding.Unicode - 这是一个错误的名称,应该是Encoding.UTF16LE,但这是.NET框架使用的名称。

StreamReader

列出Byte order mark支持的其他可能编码

如果您不知道保存文件的编码,某些编码会以BOM的形式留下提示,有时缩写为using (StreamReader sr = new StreamReader(File.OpenRead(@"c:/temp/34.csv"),Encoding.Unicode) { ... } 。字节顺序标记是文本文档的前几个字节,用于指示其编码。您可以在https://msdn.microsoft.com/en-us/library/System.Text.Encoding_properties(v=vs.110).aspx

上找到有关字节顺序标记及其某些值的更多信息

依靠BOM通常是一个坏主意,因为

  • 这不是一个完整的解决方案:某些编码不使用BOM,或使BOM可选
  • 即使您成功确定了编码,但这并不意味着StreamReader知道如何处理该编码(虽然这不太可能,但可能)
  • BOM可能根本不是BOM,但可以是实际文本的一部分(也不太可能,但可能)

在某些情况下,无法知道文件的编码,特别是如果文件来自网络上的文件上传,或者有人只是将文件邮寄给您,并且他们不知道如何对文件进行编码。这是一个很好的理由不允许“纯文本”上传(这是合理的,因为它可以做一点点重复,没有纯文本)。

tl; dr:最有可能工作的是

之一
using (StreamReader sr = new StreamReader(File.OpenRead(@"c:/temp/34.csv"),Encoding.UTF8)

using (StreamReader sr = new StreamReader(File.OpenRead(@"c:/temp/34.csv"),Encoding.UTF32)

{{1}}