我的文本文件包含诸如以下内容:
1/1/2018;0;29;10
1/2/2018;0;16;1
1/3/2018;0;32;1
1/4/2018;0;34;15
1/5/2018;0;19;2
1/6/2018;0;21;2
进一步在文本文件中是小数点,这就是为什么我尝试使用double的原因
1/29/2018;0.32;52;38
1/30/2018;0.06;44;21
我正在尝试分割分号,并将分号之间的每个值分配到一个包含31行和4列的2D数组中。
private void button1_Click(object sender, EventArgs e)
{
// 2d array
double[,] testarray = new double[31, 4];
string inputFile = File.ReadAllText("testywesty.txt");
char[] spearator = {';',' '};
for (int row = 0; row < 31; row++)
{
for (int column = 0; column < 4; column++)
{
string[] strlist = inputFile.Split(spearator);
testarray [row,column] = double.Parse(strlist[column]);
}
}
}
[我相信我具有将值插入2d数组所需的正确循环,但是,我的输入出现错误,并且我相信这是由于斜线引起的。
我的代码足以将文本文件的内容保存到数组中吗?我该如何处理'/'
字符?
您会在斜杠上得到一个错误,因为您正试图将它们转换为双精度,这是不可能的。您可以做的一件事是,首先使用该类的DateTime
方法将它们转换为Parse
,然后使用ToOADate
方法将其转换为double
。请注意,如果需要将其转换回去,可以像在下面的输出中一样使用DateTime.FromOADate
方法。
[另外,使用File.ReadAllLines
将文件读入字符串数组可能会有所帮助,其中每个字符串都是文件行(这假设每行都包含您需要的四个部分,如示例中所示)问题中的文件内容)。这样,每行代表一个row
,然后我们可以拆分该行以获得我们的columns
。
例如:
private static void button1_Click(object sender, EventArgs e)
{
var lines = File.ReadAllLines("testywesty.txt");
var items = new double[lines.Length, 4];
var delims = new[] {';', ' '};
for (var line = 0; line < lines.Length; line++)
{
var parts = lines[line].Split(delims);
var maxParts = Math.Min(parts.Length, items.GetLength(1));
for (var part = 0; part < maxParts; part++)
{
if (part == 0)
{
// Parse first item to a date then use ToOADate to make it a double
items[line, part] = DateTime.Parse(parts[part]).ToOADate();
}
else
{
items[line, part] = double.Parse(parts[part]);
}
}
}
// Show the output
var output = new StringBuilder();
for (var row = 0; row < items.GetLength(0); row++)
{
var result = new List<string>();
for (var col = 0; col < items.GetLength(1); col++)
{
result.Add(col == 0
? DateTime.FromOADate(items[row, col]).ToShortDateString()
: items[row, col].ToString());
}
output.AppendLine(string.Join(", ", result));
}
MessageBox.Show(output.ToString(), "Results");
}
输出