繁体   English   中英

从.csv读取参与者列表到C#程序中

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

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