我想阅读一个简单的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!!!");
但是当我读取文件调试代码时,注意不能读波斯语或阿拉伯语字符!我怎么解决这个问题?我认为我的文件无效编码?
答案 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);
}
}
}
答案 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通常是一个坏主意,因为
在某些情况下,无法知道文件的编码,特别是如果文件来自网络上的文件上传,或者有人只是将文件邮寄给您,并且他们不知道如何对文件进行编码。这是一个很好的理由不允许“纯文本”上传(这是合理的,因为它可以做一点点重复,没有纯文本)。
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}}