0

错误放置的屏幕截图我在 Windows 7 Enterprise 上使用 Visual Studio 2013、.NET 4.5.2、OpenXml 2.5。我创建了一段代码,将两个 .csv 文件导入到一对通用列表中,并比较它们是否存在异常。当我去构建一个通用类来加载 .csv 文件时,TextFieldParser 不起作用。它在 Main() 中工作,但不在一个类中。

尽管我怀疑答案与“在命名空间中使用别名”有关,但它在 Main() 中完美运行。Microsoft 有一个免责声明,即 rhs 不能是泛型类型,但如果它在一个地方工作,为什么不能在另一个地方工作?

这是预期的行为还是有已知的解决方法?

背景:TextFieldParser 是一个 VB.NET 类,可以巧妙地处理 .csv 或固定字段文件的解析。通用列表或列表是可以处理放置在其中的任何内容的列表类。就我而言,我使用记录类作为包含的对象。OpenXml 是一种 Microsoft 技术,用于与 Office 产品一起处理 XML 配置文件或连接字符串。我将导入配置设置以使使用的类通用。它是在尝试为我遇到问题的 TextFieldParser 构建一个通用类。谷歌已经让我走到了这一步,但没有更进一步。

Main() 中的工作代码:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualBasic.FileIO;
using ExportToExcel;

    public static void Main(string[] args)
    {
        // HARD_CODED FOR EXAMPLE ONLY - TO BE RETRIEVED FROM APP.CONFIG IN REAL PROGRAM
        string hospPath = @"C:\\events\\inbound\\OBLEN_COB_Active_Inv_Advi_Daily_.csv";
        string vendPath = @"C:\\events\\outbound\\Advi_OBlen_Active_Inv_Ack_Daily_.csv";

        List<DenialRecord> hospList = new List<DenialRecord>();
        List<DenialRecord> vendList = new List<DenialRecord>();

        using (TextFieldParser hospParser = new Microsoft.VisualBasic.FileIO.TextFieldParser(hospPath))
        {
            hospParser.TextFieldType = FieldType.Delimited;
            hospParser.SetDelimiters(",");
            hospParser.HasFieldsEnclosedInQuotes = false;
            hospParser.TrimWhiteSpace = true;

            while (!hospParser.EndOfData)
            {

                try
                {
                    string[] row = hospParser.ReadFields();
                    if (row.Length <= 7)
                    {
                        DenialRecord dr = new DenialRecord(row[0], row[1], row[2], row[3], row[4], row[5], row[6]);
                        hospList.Add(dr);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error is:  {0}", e.ToString());
                }
            }
            hospParser.Close();
            hospParser.Dispose();
        }

类中的非工作代码本身:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualBasic.FileIO;
using ExportToExcel;

namespace InputSide
{
internal class CsvLoader
{
    private int columnCount = 7;    // backing store
    private string filePath;
    private List<DenialRecord> inputList = new List<DenialRecord>();

    public List<DenialRecord> InputList
    {
        set
        {
            this.inputList = InputList;
        }
        get
        {
            return inputList;
        }
    }

    // Default constructor
    internal CsvLoader()
    {
    }

    // Exposed constructor
    public CsvLoader(List<DenialRecord> InputList,  string FilePath, int ColumnCount)
    {
        this.inputList = InputList;
        this.filePath = FilePath;
    }

    // Load csv to List<T>
    public List<DenialRecord> CsvList(int columnCount)
    {
        private int columnCount;

        using (TextFieldParser csvParser = new Microsoft.VisualBasic.FileIO.TextFieldParser(filePath))
        {
            csvParser.TextFieldType = FieldType.Delimited;
            csvParser.SetDelimiters(",");
            csvParser.HasFieldsEnclosedInQuotes = false;
            csvParser.TrimWhiteSpace = true;

            while (!csvParser.EndOfData)
            {

                try
                {
                    string[] row = csvParser.ReadFields();
                    if (row.Length <= 7)
                    {
                        DenialRecord dr = new DenialRecord(row[0], row[1], row[2], row[3], row[4], row[5], row[6]);
                        inputList.Add(dr);
                    }
                }
                catch (Exception e)
                {
                    // do something
                    Console.WriteLine("Error is:  {0}", e.ToString());
                }
            }
            csvParser.Close();
            csvParser.Dispose();
        }
        return inputList;
    }
}
}

编辑:

添加错误列表:

错误 1 ​​} 预期 c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 43 10 InputSide
错误 2 在类、结构或接口成员声明 c:\users\ jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 46 13 InputSide
错误 3 ;预期 c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 46 77 InputSide
Error 4 Invalid token '=' in class, struct, or interface member declaration c:\users\jas189\documents \visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 48 41 InputSide
错误 5 无效的令牌 ';' 在类、结构或接口成员声明中 c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 48 62 InputSide
Error 6 Invalid token '(' in class, struct, or interface member declaration c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 49 40 InputSide
错误 7 类、结构或接口成员声明中的无效标记 '=' c:\users\jas189\documents\ visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 50 53 InputSide
错误 8 类、结构或接口成员声明 c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide 中的标记“=”无效\CsvLoader.cs 51 42 输入端
错误 9 类、结构或接口成员声明中的无效标记 ')' c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 53 44 InputSide
错误 10 类中的无效标记 'if' 、结构或接口成员声明 c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 59 25 InputSide
错误 11 类、结构或接口成员声明 c 中的标记“<=”无效:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 59 40 InputSide
Error 12 Invalid token '(' in class, struct, or interface member declaration c:\users\jas189\documents\visual工作室 2013\Projects\InputSide\InputSide\CsvLoader.cs 62 42 InputSide
错误 13 类、结构或接口成员声明 c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 62 45 InputSide
错误 14 命名空间不能直接包含成员,例如作为字段或方法 c:\users\jas189\documents\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 65 21 InputSide
Error 15 类型或命名空间定义,或预期文件结尾 c:\users\jas189\文档\visual studio 2013\Projects\InputSide\InputSide\CsvLoader.cs 70 17 InputSide
错误 16 字段初始化程序无法引用非静态字段、方法或属性 'InputSide.CsvLoader.filePath' c:\users\jas189\documents \visual studio 2013\projects\inputside\inputside\csvloader。cs 46 68 输入端
错误 17 字段初始化程序无法引用非静态字段、方法或属性 'InputSide.CsvLoader.csvParser' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 58 40 InputSide 错误18 字段初始化程序无法引用非静态字段、方法或属性 'InputSide.CsvLoader.row' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 61 64 InputSide
错误 19字段初始化程序无法引用非静态字段、方法或属性“InputSide.CsvLoader.row”c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 61 72 InputSide
错误 20 字段初始化程序无法引用非静态字段、方法或属性 'InputSide.CsvLoader.row' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 61 80 InputSide
错误21 字段初始化程序无法引用非静态字段、方法或属性 'InputSide.CsvLoader.row' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 61 88 InputSide
错误 22字段初始化程序无法引用非静态字段、方法或属性“InputSide.CsvLoader.row”c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 61 96 InputSide
错误 23 字段初始化程序无法引用非静态字段、方法或属性 'InputSide.CsvLoader.row' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 61 104 InputSide
错误24 字段初始化程序无法引用非静态字段、方法或属性 'InputSide.CsvLoader.row' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 61 112 InputSide
错误 25 'InputSide.CsvLoader.CsvList(int)':并非所有代码路径都返回值 c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 42 35 InputSide
错误 26 'InputSide.CsvLoader.csvParser' 是一个'字段',但用作'类型' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 48 17 InputSide
Error 27 ' Microsoft.VisualBasic.FileIO.FieldType.Delimited' 是一个“字段”,但用作“类型” c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 48 53 InputSide 错误 28 'InputSide.CsvLoader.csvParser' 是一个'字段',但用作'类型' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 49 17 InputSide
Error 29 'InputSide. CsvLoader.csvParser' 是一个“字段”,但用作“类型” c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 50 17 InputSide
错误 30 'InputSide.CsvLoader.csvParser' 是一个'字段',但用作'类型' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 51 17 InputSide
Error 31 ' InputSide.CsvLoader.csvParser' 是一个“字段”,但用作“类型” c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 53 25 InputSide
Error 32 'InputSide.CsvLoader .row' 是一个“字段”,但用作“类型” c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 59 29 InputSide
Error 33 'InputSide.CsvLoader.inputList'是一个“字段”,但用作“类型”c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 62 29 InputSide
错误 34 'InputSide.CsvLoader.dr' 是一个'字段',但用作'类型' c:\users\jas189\documents\visual studio 2013\projects\inputside\inputside\csvloader.cs 62 43 InputSide

4

2 回答 2

1

除了可能缺少对 Microsoft.VisualBasic 的引用之外:

CsvList

  • 您不能声明private int columnCount;,因为该名称已用作参数并且
  • 应该使用if (row.Length == 7),因为如果元素少于七个,则DenialRecord dr = new DenialRecord(row[0], row[1], row[2], row[3], row[4], row[5], row[6]);在运行时将失败并出现“索引超出范围”错误。
于 2016-07-25T14:07:16.893 回答
-1

最终工作代码:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualBasic.FileIO;
using ExportToExcel;

namespace InputSide
{
    internal class CsvLoader
    {
        private int columnCount = 7;    // backing store
        private string filePath;
        private List<DenialRecord> inputList = new List<DenialRecord>();

        public List<DenialRecord> InputList
        {
            set
            {
                this.inputList = InputList;
            }
            get
            {
                return inputList;
            }
        }

        // Default constructor
        internal CsvLoader()
        {
        }

        // Exposed constructor
        public CsvLoader(List<DenialRecord> InputList,  string FilePath, int ColumnCount)
        {
            this.inputList = InputList;
            this.filePath = FilePath;
        }

        // Load csv to List<T>
        public List<DenialRecord> CsvList(int columnCount)
        {
            using (TextFieldParser csvParser = new TextFieldParser(filePath))
            {
                csvParser.TextFieldType = FieldType.Delimited;
                csvParser.SetDelimiters(",");
                csvParser.HasFieldsEnclosedInQuotes = false;
                csvParser.TrimWhiteSpace = true;

                while (!csvParser.EndOfData)
                {

                    try
                    {
                        string[] row = csvParser.ReadFields();
                        if (row.Length <= 7)
                        {
                            DenialRecord dr = new DenialRecord(row[0], row[1], row[2], row[3], row[4], row[5], row[6]);
                            inputList.Add(dr);
                        }
                    }
                    catch (Exception e)
                    {
                        // do something
                        Console.WriteLine("Error is:  {0}", e.ToString());
                    }
                }
                csvParser.Close();
                csvParser.Dispose();
            }
            return inputList;
        }
    }
}
于 2016-07-25T14:06:11.060 回答