C# 按顺序排列并在文本文件中添加占位符
我有一个包含数据的文本文件。共有3列,每列从文件中的特定位置开始,到文件中的特定位置结束。第一列(300、301、302、304…)始终基于数字。第二列是字符串,最后一列是货币 当前的.txt文件缺少数字,即(303305)。 我能够找到丢失的数字并将其添加到数组中,然后将其写入文件 我的目标是将所有列数据按顺序写入文本文件,即使是缺少的列。至于第2列和第3列,我希望C# 按顺序排列并在文本文件中添加占位符,c#,file,C#,File,我有一个包含数据的文本文件。共有3列,每列从文件中的特定位置开始,到文件中的特定位置结束。第一列(300、301、302、304…)始终基于数字。第二列是字符串,最后一列是货币 当前的.txt文件缺少数字,即(303305)。 我能够找到丢失的数字并将其添加到数组中,然后将其写入文件 我的目标是将所有列数据按顺序写入文本文件,即使是缺少的列。至于第2列和第3列,我希望0成为丢失数据的占位符,并与自己的列对齐 我很接近,但需要帮助 //read file string[] lines
0
成为丢失数据的占位符,并与自己的列对齐
我很接近,但需要帮助
//read file
string[] lines = File.ReadAllLines(FilePath);
var Numbers = new List<int>();
int i = 0;
foreach (var line in lines)
{
//get value of first column
var FirstColumn = line.Substring(0, 3);
//add it to array
Numbers.Add(Convert.ToInt32(FirstColumn));
++i;
}
//find missing numbers add to array
var result = Enumerable.Range(Numbers.Min(), Numbers.Count);
//write to file
using (StreamWriter file = new StreamWriter(OutPutFile, true))
{
foreach (var item in result.ToArray())
{
file.WriteLine(item);
}
}
Console.ReadKey();
目标:所需的输出.txt文件
300 Family Guy 1,123
301 Dexters Lab 456
302 Rugrats 1,789.52
304 Scooby-Doo 321
306 Recess 2,654
307 Popeye 1,987.02
300 Family Guy 1,123
301 Dexters Lab 456
302 Rugrats 1,789.52
303 0 0
304 Scooby-Doo 321
305 0 0
306 Recess 2,654
307 Popeye 1,987.02
您正在阅读第一列,但没有阅读其余的。我要做的是创建一个字典,使用第一个数字作为索引,并将其他两个字段填充到一个
System.ValueTuple
(您需要包含ValueTyple numget包才能使其正常工作)
首先,我设置了一些东西:
const int column1Start = 0;
const int column1Length = 3;
const int column2Start = 8;
const int column2Length = 15;
const int column3Start = 24;
int indexMin = int.MaxValue; //calculated during the first
int indexMax = int.MinValue; //pass through the file
然后我创建我的字典。(string,decimal)
语法描述了一个2元组,其中包含一个字符串和一个十进制数(有点像高中时教的有序对)
非常感谢。我运行了你的代码并检查了它。它起作用了!!
Dictionary<int, (string, decimal)> data = new Dictionary<int, (string, decimal)>();
var lines = File.ReadAllLines(fileName);
foreach (var line in lines) {
//no error checking
var indexString = line.Substring(column1Start, column1Length);
var cartoon = line.Substring(column2Start, column2Length).TrimEnd();
var numberString = line.Substring(column3Start);
if (int.TryParse(indexString, out var index)) {
//I have to parse the first number - otherwise there's nothing to index on
if (!decimal.TryParse(numberString, out var number)){
number = 0.0M;
}
data.Add(index, (cartoon, number));
if (index < indexMin) {
indexMin = index;
}
if (index > indexMax) {
indexMax = index;
}
}
}
for (int i = indexMin; i <= indexMax; ++i) {
if (!data.TryGetValue(i, out var val)){
val = ("0", 0.0M);
}
Console.WriteLine($"{i,5} {val.Item1,-column2Length - 2} {val.Item2, 10:N}");
}
300 Family Guy 1,123.00
301 Dexters Lab 456.00
302 Rugrats 1,789.52
303 0 0.00
304 Scooby-Doo 321.00
305 0 0.00
306 Recess 2,654.00
307 Popeye 1,987.02