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