0

我正在尝试设置代码以将.CSV文件导入.NET。

我已经尝试过两者Microsoft.Jet.OLEDB.4.0Microsoft.ACE.OLEDB.12.0提供程序,包括修改Extended Properties甚至修改每个提供程序的相应注册表项。我还没有为我正在尝试做的事情想出一个解决方案:

我想将每个字段作为文本导入,但不截断超过 255 个字符的字段。

到目前为止,我发现我可以拥有一个或另一个,但不能同时拥有。

  • 如果我将ImportMixedTypes注册表值设置为Majority Type,它将保留 255+ 个字符的文本字段不被截断,但会将其他字段转换为不需要的类型。
  • 如果我将ImportMixedTypes注册表值设置为Text,它会截断超过 255 个字符的文本字段,但将其他字段类型保留为文本。

如何使用 OleDb 完成此任务?


附加信息:

我有一个“注释”列,其中可以包含很长的文本。我还有一个“邮政编码”列,其中包含混合邮政编码格式(5 位和 9 位带破折号)。通常,5 位邮政编码格式更受欢迎,因此导入器认为该列应为整数类型,导入后将 9 位邮政编码保留为空值。

4

2 回答 2

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;
            }
        }
    }
}
于 2013-08-23T23:34:33.797 回答
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;
    }
于 2015-08-24T17:04:17.783 回答