0

我有一个处理一些大型 CSV 文件的系统。

现在出现的情况是,这些文件可能在实际逗号分隔的内容之前有许多非分隔的、毫无价值的行。

我采用的方法是创建一个临时阅读器来确定多余行的数量,然后将正在工作的 TextReader 移动到准备处理的行数上。

我的代码如下:

private static TextReader PrepareReader(TextReader reader)
    {
        // Variables
        TextReader tmpReader = reader;
        Int32 superfluousLineCount = 0;

        // Determine how many useless lines we have
        using (tmpReader)
        {
            string line;
            string headerIdentifier = "&1,";
            while ((line = tmpReader.ReadLine()) != null)
            {
                // Check if the line starts with the header row identifier
                if (line.Substring(0, 3) != headerIdentifier)
                {
                    // Increment the superfluous line counter
                    superfluousLineCount++;
                }
                else
                {
                    break;
                }
            }
        }

        // Move the source reader through how many lines we want to ignore
        using (reader)
        {
            for (int i = superfluousLineCount; i > 0; i--)
            {
                reader.ReadLine();
            }
        }

        // Return
        return reader;
    }

但是,reader.ReadLine();在这部分代码中:

for (int i = superfluousLineCount; i > 0; i--)
{
reader.ReadLine();
}

...引发以下异常

无法从关闭的 TextReader 中读取。mscorlib 方法中的 ObjectDisposedException:Void ReaderClosed()

堆栈跟踪:在 System.IO.__Error.ReaderClosed() 在 System.IO.StreamReader.ReadLine() 在 CsvReader.PrepareReader(TextReader reader) 在 CsvReader.cs:line 93

非常感谢任何建议。另外,这是应对挑战的最佳方式吗?

注释:框架 2.0

谢谢。

4

2 回答 2

7

当你使用using (tmpReader)它时它会关闭tmpReader(它引用相同的对象reader),所以当你尝试从reader循环中读取时,它会关闭。

你最好的选择是结合这两个循环。因为你只想跳过行,我认为第一个循环的逻辑就足够了。

于 2012-06-14T15:06:49.577 回答
0

我认为你只需要这样做(规范化/纠正它,我做了一些简化而没有任何编译或测试):

    // edit
    private static TextReader PrepareReader(TextReader reader, out string outLine)
    {



            string line;
            string headerIdentifier = "&1,";
            while ((line = reader.ReadLine()) != null)
            {
                // Check if the line starts with the header row identifier
                if (line.Substring(0, 3) != headerIdentifier)
                {
                    // ... do nothing
                }
                else
                {
                    // edit
                    outLine = line;
                    break;
                }
            }

    }

IOW 使用输入参考,并将阅读器移动到您想要的位置。

请注意在此方法之外关闭您的阅读器

于 2012-06-14T15:14:20.350 回答