[英]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.