我有一个制表符分隔的文本文件,其中包含一些十进制值:0,12(逗号为小数点分隔符)。 我通过Provider = Microsoft.Jet.OLEDB.4.0将其内容解析为OleDBDataReader,但是当我查看结果时,应该是十进制的值被转换为DateTime!
如何“强制”我的应用程序将逗号理解为数字的小数分隔符? 没有工作将cultureinfo更改为en-US或任何其他。
public static OleDbDataReader CriarOleDbDataReader(string sCaminhoArquivo)
{
FileInfo fi = new FileInfo(sCaminhoArquivo);
string format;
string linha;
if (fi.Extension.ToLower().Equals(".csv"))
{
string texto = System.IO.File.ReadAllText(sCaminhoArquivo).Replace(',', ';');
System.IO.File.WriteAllText(sCaminhoArquivo, texto);
linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0];
format = "Delimited(;)";
}
else
{
linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0];
format = (linha.Split('\t').Count() > 1) ? "TabDelimited" : "Delimited(;)";
}
DefinirSchema(fi, format);
string cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fi.DirectoryName + ";Extended Properties='text;HDR=Yes';";
OleDbConnection con = new OleDbConnection(cn);
OleDbCommand cmd = new OleDbCommand("select * from [" + fi.Name + "]", con);
OleDbDataReader dr;
con.Open();
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
字段“IOF”是一个小数,它在.txt文件中的值是0,02,但它返回datetime。
dr["iof"]
{30/12/1899 00:02:00}
Date: {30/12/1899 00:00:00}
Day: 30
DayOfWeek: Saturday
DayOfYear: 364
Hour: 0
Kind: Unspecified
Millisecond: 0
Minute: 2
Month: 12
Second: 0
Ticks: 599264353200000000
TimeOfDay: {00:02:00}
Year: 1899
答案 0 :(得分:1)
刚刚解决了。 我必须在schema.ini文件中添加更多行,它们尝试确定文件中每列的de数据类型。得到它here
这两个孩子做了这个伎俩:
ColNameHeader =真
的MaxScanRows = 0
希望它有所帮助。
答案 1 :(得分:0)
“如何”强制“我的应用程序将逗号理解为数字的小数分隔符?”
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
decimal val = decimal.Parse("0,02");
上面的代码生成小数值0.02。
答案 2 :(得分:0)
您需要其中一个
1
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(“任何文化,其中小数以逗号分隔,而不是点”);
如果你身处美国文化
这是伪代码,而不是精确的语法
decimal.Parse("0,02").Split(",").Join("."))
3
您的文件以制表符分隔。使用stream将其加载到datatable而不是使用OleDb