繁体   English   中英

读取.csv文件并将其存储在数组中?

[英]Read .csv file and store it in an array?

我正在进行一项将.csv文件中的数据存储到数组中的赋值。 我用过(int i = 0; i <data.Length; i ++),但i ++无法访问。 看看你将会了解的代码。 问题在于可能只是存储。 如果可以,请帮助我。

谢谢

static void Load(string[] EmployeeNumbers, string[] EmployeeNames, string[] RegistrationNumbers, float[] EngineCapacityArray,
        int[] StartKilometresArray, int[] EndKilometresArray, string[] TripDescriptions, bool[] PassengerCarriedArray,
        ref int NextAvailablePosition, ref int RecordCount, ref int CurrentRecord)
    {
        string str = "";
        FileStream fin;
        string[] data;
        bool tval = false;
        // Open the input file
        try
        {
            fin = new FileStream("carallowance.csv", FileMode.Open);
        }
        catch (IOException exc)
        {
            Console.WriteLine(exc.Message);
            return;
        }
        // Read each line of the file
        StreamReader fstr_in = new StreamReader(fin);
        try
        {
            while ((str = fstr_in.ReadLine()) != null)
            {
                // Separate the line into the name and age
                data = str.Split(';');
                if (data.Length == 8)
                {
                    Console.WriteLine("Error: Could not load data from the file. Possibly incorrect format.");
                }
                for (int i = 0; i < data.Length; i++)
                {
                    EmployeeNumbers[NextAvailablePosition] = data[0];
                    EmployeeNames[NextAvailablePosition] = data[1];
                    RegistrationNumbers[NextAvailablePosition] = data[2];
                    tval = float.TryParse(data[3], out EngineCapacityArray[NextAvailablePosition]);
                    tval = int.TryParse(data[4], out StartKilometresArray[NextAvailablePosition]);
                    tval = int.TryParse(data[5], out EndKilometresArray[NextAvailablePosition]);
                    TripDescriptions[NextAvailablePosition] = data[6];
                    tval = bool.TryParse(data[7], out PassengerCarriedArray[NextAvailablePosition]);

                    CurrentRecord = NextAvailablePosition;
                    NextAvailablePosition++;
                    RecordCount++;
                    Console.WriteLine("Your file is sucessfully loaded.");

                    break;
                }
            }
        }
        catch (IOException exc)
        {
            Console.WriteLine(exc.Message);
        }
        // Close the file
        fstr_in.Close();
    }

由于休息,它无法到达; 在循环结束时。 这迫使for循环在第一次执行后停止执行。 如果你在一个控制台项目中运行它,它只会输出0。

    private static void Main(string[] args)
    {
        for (int i = 0; i < 2; i++)
        {
            Console.WriteLine(i.ToString());
            break;
        }
    }

也许代码审查stackexchange会更好。 这里有很多问题。

首先,我们可以简化使用框架调用File.ReadAllLines (...)。 这将为您提供文件中所有行的序列。 然后你想把它转换成一系列数组(拆分为',')。 这很简单:

var splitLines = File.ReadAllLines("\path")
                     .Select(line => line.Split(new char[] { ',' }));

现在,您可以使用foreach迭代splitLines。

(我注意到你似乎正在将值设置到传入的数组中。尽量不养成这样做的习惯。这些副作用和滥用参考参数很容易变得非常脆弱。)

那看起来很奇怪:

if (data.Length == 8)
{
    Console.WriteLine("...");
}

我怀疑你的比较运算符中只有一个拼写错误(应该是!=)。 如果您不关心在错误数据上写入控制台,您只需在转换后过滤掉错误数据。 看起来像:

var splitLines = File.ReadAllLines("\path")
                     .Select(line => line.Split(new char[] { ',' }))
                     .Where(data => data.Length == 8);

现在回想一下[int/float].TryParse(s, out v)将v设置为已解析的值,或者类型的默认值,如果解析成功则返回true。 那个“或默认”在这里很重要。 这意味着如果无法解析它们就会填充错误/无效值,并且您对tval一无所知。

而不是所有这些,考虑一个表示数据集中记录的对象/类型。 看起来您正试图从csv表中跟踪员工里程数。 看起来像是这样的:

public class MileageRecord
{
    public string Name { get; set; }
    /* More properties */
    public MileageRecord FromCSV(string[] data)
    {
        /* try parsing, if not then log errs to file and return null */
    }
}

现在你已经摆脱了所有副作用,整个事情变得更加清晰。 从文件加载所有这些数据就像这样简单:

public static IEnumerable<MileageRecord> Load()
{
    return File.ReadAllLines("\path")
               //.Skip(1) // if first line of the file is column headers
               .Select(line => line.Split(new char[] { ',' }))
               .Where(data => data.Length == 8)
               .Select(data => MileageRecord.FromCSV(data))
               .Where(mileage => mileage != null);
}

这段代码:

            NextAvailablePosition++;
            RecordCount++;
            Console.WriteLine("Your file is sucessfully loaded.");

            break; // <-- this instruction
        }

带你离开for循环,没有增加i值的可能性。

问题:你应该在if condition (在while循环中)中添加break语句,这样如果数据Length与8不匹配,那么它将从循环中断/退出。 但你错误地在for-loop添加了break这就是为什么它只在第一次执行并且循环出来。

解决方案:break语句从for循环移到while循环中的if-blcok。

尝试这个:

第1步:从for循环中删除break语句。

                CurrentRecord = NextAvailablePosition;
                NextAvailablePosition++;
                RecordCount++;
                Console.WriteLine("Your file is sucessfully loaded.");

               // break; //move this statement to inside the if block

第2步:break语句放在if循环中的if-block中。

          if (data.Length == 8)
            {
                Console.WriteLine("Error: Could not load data from the file. Possibly incorrect format.");
                break;
            }

建议:您可以使用File.ReadAllLines()方法重新编写代码,以避免以下复杂性:

static void Load(string[] EmployeeNumbers, string[] EmployeeNames, string[] RegistrationNumbers, float[] EngineCapacityArray,
  int[] StartKilometresArray, int[] EndKilometresArray, string[] TripDescriptions, bool[] PassengerCarriedArray,
  ref int NextAvailablePosition, ref int RecordCount, ref int CurrentRecord)
  {
           string str = "";        
           string[] data;
           bool tval = false;
           String [] strLines=File.ReadAllLines("carallowance.csv");
           for(int i=0;i<strLines.Length;i++)
           {
            str=strLines[i];
            data = str.Split(';');
            if (data.Length == 8)
            {
                Console.WriteLine("Error: Could not load data from the file. Possibly incorrect format.");
                break;
            }//End of if block
            else
            {
                EmployeeNumbers[NextAvailablePosition] = data[0];
                EmployeeNames[NextAvailablePosition] = data[1];
                RegistrationNumbers[NextAvailablePosition] = data[2];
                tval = float.TryParse(data[3], out EngineCapacityArray[NextAvailablePosition]);
                tval = int.TryParse(data[4], out StartKilometresArray[NextAvailablePosition]);
                tval = int.TryParse(data[5], out EndKilometresArray[NextAvailablePosition]);
                TripDescriptions[NextAvailablePosition] = data[6];
                tval = bool.TryParse(data[7], out PassengerCarriedArray[NextAvailablePosition]);

                CurrentRecord = NextAvailablePosition;
                NextAvailablePosition++;
                RecordCount++;                    
             } //End of else block
            } //End of for loop
           Console.WriteLine("Your file is sucessfully loaded.");
   } //End of function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM