【发布时间】:2014-10-17 15:30:52
【问题描述】:
使用流式阅读器读取带有日文字符双引号字段的 csv 文件。它不读取日文字符并将其视为 unicode 字符。我尝试了不同的编码类型,但它不适合我。请分享一些想法或其他解决方案来解决这个问题。或者有没有更好的方法。
public DataTable ReadDataFromCSV(string path, char delim)
{
string fulltext;
string[] arrColumnNames;
string[] arrColumnValues;
string[] arrRows;
int i, j, n;
System.Data.DataTable dt = new System.Data.DataTable();
DataRow row;
if (delim.ToString().Length < 1)
{
delim = ',';
}
try
{
//' check that the file exists before opening it
if (File.Exists(path))
{
using (TextReader sr = new StreamReader(path,Encoding.UTF8))
{
fulltext = sr.ReadToEnd();
arrRows = fulltext.Split('\n');
arrColumnNames = arrRows[0].Replace('"', ' ').Trim().Split(delim);
//'add columns to a datatable
for (n = 0; n < arrColumnNames.Length - 1; n++)
{
dt.Columns.Add(new DataColumn(arrColumnNames[n], System.Type.GetType("System.String")));
}//next
for (i = 1; i < arrRows.Length - 1; i++)
{
arrColumnValues = arrRows[i].Replace('"', ' ').Trim().Split(delim);
row = dt.NewRow();
for (j = 0; j < (arrColumnNames.Length - 1); j++)
{
try
{
if (!(arrColumnValues[j] == null))
{
row[arrColumnNames[j]] = arrColumnValues[j].Replace('"', ' ').Trim();
}
else
{
row[arrColumnNames[j]] = "";
}//End If
}
catch (Exception ex)
{
Console.Write("ERROR: " + ex.Message);
}
}//next
dt.Rows.Add(row);
}//next
}
}//End if
}
catch (Exception ex)
{
Console.Write("ERROR: " + ex.Message);
}
finally
{
}//End Try
return dt;
}
【问题讨论】:
-
@TomTom:应该注意的是,OP 没有在任何地方说明他们假设文件是 ASCII 编码的;事实上,他们确实将
Encoding.UTF8设置为阅读器的编码。 (显然,这仍然不是文件的编码,但它已经满足了您假设“根本不是 ASCII,而是某种 UNICODE”的建议。) -
我也没有收到@TomTom 的评论,为什么要把 ascii 带入这个讨论? .NET 不会默认为 ascii,即使他没有指定它,也没有理由认为使用日文字符的人会认为文件是 ASCII?
-
Neo,如果您能提供文件以便我们重现此文件会更容易。另外你的操作系统是什么语言/安装了日语吗? (也许它正在正确读取文件,但 Visual Studio 没有可用于渲染的字符集?)
-
每个标准的 CSV 不是 Unicode 编码的,以防万一有人没有意识到这一点。 Unicode / UTF 标准还要求文件中似乎缺少前缀(字节顺序标记)。这意味着如果文件包含 Unicode 编码元素,它是 - 啊 - 没有有效编码。请参阅unicode.org/mail-arch/unicode-ml/y2002-m04/0064.html 了解有关 UTF 如何按标准工作的一些基础知识。
-
@TomTom:您链接到的文件明确声明“UTF-8 不需要 BOM”。因此,您关于文件自动“未有效编码”的说法是不正确的。
标签: c# winforms c#-4.0 c#-3.0 fastercsv