[英]Reading a participant list from a .csv into C# program
我正在编写一个小程序,该程序将从Excel工作表中读取某些人的名字,姓氏,ID和电子邮件到控制台,这不是问题,而是获得以下输出:
Poul EjnarRovsingpersomething@mail.com
ReneBach2014914something@mail.com
JohnJohnsson3950185something@mail.com
我希望输出与此类似:
Poul Ejnar Rovsing per something@mail.com
Rene Bach 2014914 something@mail.com
John Johnsson 3950185 something@mail.com
我正在使用的代码为我提供了此输出,这肯定是朝正确方向迈出的一步,但与我要寻找的不完全相同:
Poul Ejnar Rovsing per something@mail.com
Rene Bach 2014914 something@mail.com
John Johnsson 3950185 something@mail.com
由于某种原因,它仅输出其他所有行,而不是全部输出,这也让我很困惑。 我在这里想念什么?
这是我的代码:
static void Main(string[] args)
{
string[] tokens;
char[] separators = {';'};
string str = "";
string newSeparator = " ";
FileStream fs = new FileStream(@"D:\Dokumenter\Skole\6. semester\GUI\Exercises\Exercise2\02 deltagerliste.csv", FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.Default);
while ((str = sr.ReadLine()) != null)
{
str = sr.ReadLine();
tokens = str.Split(separators, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(tokens[0] + newSeparator + tokens[1] + newSeparator + tokens[2] + newSeparator + tokens[3]);
}
Console.ReadLine();
}
对于固定宽度格式,可以使用String.Format
来利用复合格式和对齐方式。 例如:
String.Format("{0,10}", "name"); // output blocks of 10 characters, right aligned
String.Format("{0,-10}", "name"); // output blocks of 10 characters, left aligned
格式字符串的格式为: {index[,alignment][:formatString]}
。 要使项目左对齐,请使用负值进行对齐。
要在复合格式的字符串中使用它,只需在大括号中添加更多格式的占位符,索引对应于String.Format
参数的索引:
var sString = "name";
var anInt = 1;
var aDecimal = 1.23M;
var s = String.Format("|{0,10}|{1,10:0}|{2,10:0.00}|", sString, anInt, aDecimal);
输出:
| name| 1| 1.23|
而且,每次您在while
循环中进行迭代时,它都会跳过其他每一行,您读了一行,然后再次读取:
while ((str = sr.ReadLine()) != null) // <--- first read
{
str = sr.ReadLine(); // <--- second read replaces the first one
尝试使用while和最后读取的do
循环
str = sr.ReadLine();
do {
... do stuff here ...
} while ((str = sr.ReadLine()) != null);
您两次调用ReadLine
,并且跳过一行也使用\\t
,这会使选项卡中的输出缩进。
您正在阅读每隔一行,因为有两个对StreamReader的调用
while ((str = sr.ReadLine()) != null)
{
str = sr.ReadLine(); // Don't need this one!
...
While
语句中的第一个调用将使读者前进一行。 第二个调用将再次推进它,覆盖您以前阅读的内容。
要获得正确的间距,可以使用\\t
插入制表符,但是仍然需要对每个标记的大小做一些数学运算,以便可以使用正确数量的制表符。 或者,您可以使用String.PadRight使每一列具有特定的长度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.