簡體   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