我正在尝试设置代码以将.CSV
文件导入.NET。
我已经尝试了Microsoft.Jet.OLEDB.4.0
和Microsoft.ACE.OLEDB.12.0
个提供程序,包括修改Extended Properties
甚至为每个提供程序修改相应的注册表项。我还没有想出一个我正在尝试做的解决方案:
我想将每个字段导入为文本,但保留长度超过255个字符的字段未截断。
到目前为止,我发现我可以拥有一个或另一个,但不是两个。
ImportMixedTypes
注册表值设置为Majority Type
,则会使255个字符的文本字段未被截断,但会将其他字段转换为不需要的类型。ImportMixedTypes
注册表值设置为Text
,则会截断255个以上的字符文本字段,但会将其他字段类型保留为文本。如何使用OleDb完成此操作?
其他信息:
我有一个“备注”列,可以包含非常冗长的文本。我还有一个“邮政编码”栏,其中包含混合邮政编码格式(5位数字和9位数字,带短划线)。通常,5位数的邮政编码格式更受欢迎,因此导入者认为该列应为整数类型,导入后将9位邮政编码保留为空值。
答案 0 :(得分:1)
您是否考虑过使用像FileHelpers库(http://filehelpers.sourceforge.net/)这样多功能的东西?
或者,如果您的要求不超过您的要求(阅读csv文件,获取字符串字段),请使用非常简单的内容,例如:
public static class SimpleCsvImport
{
public static IEnumerable<List<string>> Import(string csvFileName)
{
using (var reader = File.OpenText(csvFileName))
{
while (!reader.EndOfStream)
{
var fields = reader.ReadLine().Split(new[] { ',' }, StringSplitOptions.None).Select(f => f.Trim()).ToList();
if (fields.Count > 0)
yield return fields;
}
}
}
}
答案 1 :(得分:0)
我已经实现了这段代码来读取备忘录字段(Microsoft Access):
private string GetMemoField(string TableName, string FieldName, string IdentityFieldName, string IdentityFieldValue, OleDbConnection conn)
{
string ret = "";
OleDbCommand cmd1 = new OleDbCommand("SELECT " + FieldName + " FROM “ + TableName + “ WHERE " + IdentityFieldName + "=" + IdentityFieldValue, conn);
var reader = cmd1.ExecuteReader(System.Data.CommandBehavior.SequentialAccess); // Create the DataReader that will get the memo field one buffer at a time
if (reader.Read())
{
long numberOfChars = reader.GetChars(/*Field pos*/ 0, 0, null, 0, 0); // Total number of memo field's chars
if (numberOfChars > 0)
{
int bufferSize = 1024;
char[] totalBuffer = new char[64*bufferSize]; // Array to hold memo field content
long dataIndex = 0;
do
{
char[] buffer = new char[bufferSize]; // Buffer to hold single read
long numberOfCharsReaded = reader.GetChars(0, dataIndex, buffer, 0, bufferSize);
if (numberOfCharsReaded == 0)
{
ret = new string(totalBuffer,0, (int)numberOfChars);
break;
}
Array.Copy(buffer, 0, totalBuffer, dataIndex, numberOfCharsReaded); // Add temporary buffer to main buffer
dataIndex += numberOfCharsReaded;
} while (true);
}
}
return ret;
}