【问题标题】:How to validate/match data from different files in C#如何在 C# 中验证/匹配来自不同文件的数据
【发布时间】:2017-12-11 00:00:26
【问题描述】:

我正在为一个项目创建一个假航班跟踪器,并且需要检查 Flight.csv 文件(所有单个航班)中的行总和是否与 Airport.csv 文件中的 numOfFlights 变量匹配。如何交叉检查这两个文件中的数据而无需合并它们?

以下是相关代码,如果需要更多代码来解决问题,请 lmk。

static void Main()
    {
        Flight[] flight = new Flight[1000];
        Airport[] airport = new Airport[1000];
        int flightCount = 0;
        int airportCount = 0;

        ReadFlightFile(ref flight, ref flightCount);
        ReadAirportFile(ref airport, ref airportCount);

        int numRecords = flightCount;            

        OutputFlightMenu();
        string userInput = "----";
        while (userInput != "exit")
        {
            userInput = ReadLine().ToLower();
            Clear();
            OutputFlightMenu();
            switch (userInput)
            {
                case "passengers":
                    //Stuff
                    break;
                case "time":
                    //Stuff
                    break;
                case "average":
                    //Stuff
                    break;
                case "sub":
                    OutputSubMenu();
                    string userInput2 = "----";
                    while (userInput2 != "quit")
                    {
                        userInput2 = ReadLine().ToLower();
                        Clear();
                        OutputSubMenu();
                        switch (userInput2)
                        {
                            case "flight":
                                //Stuff
                                break;
                            case "count":
                                //Stuff
                                break;
                            case "airline":
                                //Stuff
                                break;
                            default:
                                WriteLine("Invalid input. Please try again.");
                                break;

                        }
                    }
                    Clear();
                    WriteLine("====Exiting System===");
                    break;
                case "report":
                    //Stuff
                    break;
                default:
                    WriteLine("Invalid input. Please try again.");
                    break;
            }
        }
        Clear();
        WriteLine("=====Goodbye=====");
        ReadKey();

    }

    public static void ReadFlightFile(ref Flight[] flight, ref int flightCount)
    {
        string path = "Flight.csv";
        FileStream fs = new FileStream(path, FileMode.Open);
        StreamReader sr = new StreamReader(fs);
        while (sr.Peek() > -1)
        {
            string line = sr.ReadLine();
            string[] flightArray = line.Split(',');

            flight[flightCount] = new Flight(int.Parse(flightArray[0]), flightArray[1], int.Parse(flightArray[2]),
                int.Parse(flightArray[3]), int.Parse(flightArray[4]));

            flightCount++;

        }

    }
    //Basic Read Method
    public static void ReadAirportFile(ref Airport[] airport, ref int airportCount)
    {
        string path = "Airport.csv";
        FileStream fs = new FileStream(path, FileMode.Open);
        StreamReader sr = new StreamReader(fs);
        while (sr.Peek() > -1)
        {
            string line = sr.ReadLine();
            string[] airportArray = line.Split(',');

            airport[airportCount] = new Airport(int.Parse(airportArray[0]), airportArray[1], airportArray[2], 
                int.Parse(airportArray[3]), DateTime.Parse(airportArray[4]));

            airportCount++;
        }
    }

这是来自各个文件的数据:

Flight.csv:

3446,三角洲,91,120,120

2789,United,34,56,78

9078,美国,200,240,210

9079,美国,67,156,165

4567,西南,89,89,91

6799,三角洲,95,67,55

1265,United,102,187,175

8421,美国,12,191,191

3332,西南,78,45,44

Airport.csv:

9000,ATL,亚特兰大,9,12/9/2017

如您所见,机场数组 (9) 中的 numOfFlights 元素与航班总和匹配。

对于这个项目的意图,我已经知道数据会匹配,但我需要能够验证这一点。

感谢任何可以提供帮助的人。

【问题讨论】:

  • As you can see, the numOfFlights element in the airport array (9) DOES match the sum of the flights. 我看不到。你能分解一下你是如何得出这个结论的吗?
  • 只需将您的numOfFlightsflightCount 进行比较
  • 用文字解释你要做什么。 “交叉检查数据”没有任何意义,而且从您的代码中根本不清楚您的意图是什么。你的代码有问题吗?它是崩溃还是无法编译,还是什么?
  • @mjwills 当然可以! Airport.csv 中的第四个元素 (9) 匹配 Flight.csv 中的字面总航班数。
  • 文件中是否只有一个机场记录?如果还有更多呢?如果不能有更多,为什么要使用数组?

标签: c# csv filestream streamreader


【解决方案1】:

airport.Where(o=>o.numOfFlights==flightCount) 将返回 numOfFlights 等于 flightCount 的机场。您应该使用 List 而不是数组来存储 Flight 和 Airport

【讨论】:

    【解决方案2】:

    让您的 Read 方法接受文件名并返回 List 或数组的更好风格(其中集合的大小是您的 Count 值):

    public static IList<Flight> ReadFlightFile(string filePath)
    {
        var result = new List<Flight>();
        foreach(var line in File.ReadLines(filePath))
        {
            string[] flightArray = line.Split(',');
    
            result.Add(new Flight(int.Parse(flightArray[0]), flightArray[1], int.Parse(flightArray[2]),
                int.Parse(flightArray[3]), int.Parse(flightArray[4]));
    
        }
        return result;
    }
    
    //Basic Read Method
    public static IList<Airport> ReadAirportFile(string filePath)
    {
        var result = new List<Airport>();
        foreach(string line in File.ReadLines(filePath))
        {
            string[] airportArray = line.Split(',');
    
            result.Add(new Airport(int.Parse(airportArray[0]), airportArray[1], airportArray[2], 
                int.Parse(airportArray[3]), DateTime.Parse(airportArray[4]));
        }
        return result;
    }
    

    这样做,您可以将其添加到您的其他代码中:

    static void Main()
    {
        var flights = ReadFlightFile("Flight.csv");
        var airport = ReadAirportFile("Airport.csv");   
    
        if (airport[0].numOfFlights == flights.Count)
        {
            //things match
        }
        else
        {
            //things don't match
        }       
    
        // rest of your code is down here:
    
    }
    

    【讨论】:

      【解决方案3】:

      这比你做的要简单得多。

      要计算 Flight.csv 中的行数,您可以使用以下命令:

      int lineCount = File.ReadAllLines("Your/Path/To/Flight.csv").Count();
      

      如果你有标题,你应该 -1

      要获取 Airport.csv 中的航班数量,只需打开它,拆分为一个数组,然后像这样获取数字:

      string[] AirportContents = File.ReadAllText("Your/Path/To/Airport.csv").Split(',');
      int flightsToday = Convert.ToInt32(AirportContents[3]);
      

      如果有标题,您可以将文件内容放入列表并读取第二项[1](但您没有在示例中放置标题)

      一旦你有了这两个号码,你就可以用它们做任何你想做的事情。

      【讨论】:

        猜你喜欢
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多