2012-04-17 39 views
1

我知道這個問題之前已經被問過了,但我對答案並不滿意(考慮到它沒有解釋發生了什麼)。簡單的csv逗號分隔的html表根gen

我的具體問題是:如何打開由逗號分隔的行和csv文件,並使用C#將其放入HTML表中?

我明白如何在PHP中這樣做,但我剛剛開始學習ASP.Net/C#,如果任何人有一些免費的C#資源和/或能夠提供一段代碼與一些解釋什麼繼續我將不勝感激。我不知道如何使用它,因爲A)我不知道如何C#數組工作和B)我不知道如何打開ASP.Net中的文件C#:我不知道如何打開C#

var lines =File.ReadAllLines(args[0]); 
    using (var outfs = File.AppendText(args[1])) 
    { 
     outfs.Write("<html><body><table>"); 
     foreach (var line in lines) 
      outfs.Write("<tr><td>" + string.Join("</td><td>", line.Split(',')) + "</td></tr>"); 
     outfs.Write("</table></body></html>"); 
    } 

我很抱歉我在這裏的經驗不足。

+0

數組:http://msdn.microsoft.com/en-us/library/aa288453%28v=vs.71%29.aspx – 2012-04-17 18:38:26

+0

閱讀文本文件:http://www.csharp-station.com/HowTo /ReadWriteTextFile.aspx – 2012-04-17 18:39:20

+1

你的具體問題是什麼? – 2012-04-17 18:39:57

回答

2

您發佈的代碼示例做你問什麼:

  1. 打開文件。
  2. 將表格的HTML字符串從步驟1寫入另一個文件。

讓我們把它分解:

var lines =File.ReadAllLines(args[0]); 

這將打開在args [0]指定的文件,並讀取所有的線成一個字符串數組,每個元件外行一個。請參閱File.ReadAllLines Method (String)

using (var outfs = File.AppendText(args[1])) 
{ 

File.AppendText Method創建一個StreamWriter將文本追加到現有的文件(或創建它,如果它不存在)。文件名(和路徑,可能)在args [1]中。 using語句將StreamWriter放入所謂的使用塊中,以確保在使用塊被保留後流正確放置。有關更多信息,請參閱using Statement (C# Reference)

outfs.Write("<html><body><table>"); 

outfs.Write調用的StreamWriter(StreamWriter.Write Method (String))的Write方法。實際上,在你的代碼片段中,除非你退出使用塊,否則什麼都不寫入文件 - 它被寫入緩衝區。退出使用塊將刷新緩衝區並寫入文件。

foreach (var line in lines) 

該命令啓動通過字符串數組lines中的所有元素的循環,與第一(元素0)索引凝視。如果您需要更多信息,請參閱foreach, in (C# Reference)

 outfs.Write("<tr><td>" + string.Join("</td><td>", line.Split(',')) + "</td></tr>"); 

String.Join是這裏的關鍵部分,大部分工作都是在這裏完成的。String.Join Method (String, String[])有技術細節,但基本上這裏發生的是第二個參數(line.Split(','))正在傳遞一個字符串數組,然後該數組中的字符串與第一個參數(</td><td>)一起作爲分隔符連接在一起,並且表格行正在打開和關閉。

例如,如果行是「1,2,3,4,5,6」,則Split會爲您提供6個元素的數組。然後該陣列與</td><td>作爲String.Join的分隔符進行連接,因此您有"1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6""<tr><td>"被添加到前面,"</td></tr>"被添加到最後,最後一行是"<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr>"

outfs.Write("</table></body></html>");  
} 

這將HTML的末尾寫入緩衝區,然後刷新並寫入指定的文本文件。

有幾件事要注意。 args[0]args[1]用於保存命令行參數(即,MakeMyTable.exe InFile.txt OutFile.txt),這些參數(根據我的經驗)不適用於ASP.NET應用程序。您需要對必需的文件(和路徑)進行編碼,或者允許用戶指定輸入文件和/或輸出文件。 ASP.NET應用程序需要在有權訪問這些文件的帳戶下運行。

如果您在CSV文件中引用了值,則需要處理這些值(例如,在處理貨幣金額時這很常見),因爲拆分,可能會導致錯誤拆分。我建議看看TextFieldParser,因爲它可以輕鬆處理引用的字段。

除非您確定文件中的每一行具有相同數量的字段,否則您可能會冒着在表格中形成格式不良的風險,並且無法保證它將如何呈現。

此外,建議您測試打開的文件是否存在。可能還有更多,但這些是基礎知識(可能已經超出了Stack Overflow的範圍)。

+0

我不是故意在我原來的帖子中發出如此愚蠢的聲音,但我確實有點看看打開的文件行'var lines = File.ReadAllLines(args [0])'是怎麼回事;'但是被數組在那裏並且在代碼中沒有指定實際文件位置而感到困惑。另外,我沒有處理引號的用處,在我的csv文件中永遠不會有引號,我很抱歉沒有明確說明。最後,感謝您試圖爲我解決問題,似乎我不理解這個問題的全部問題都來自'args [0]'數組。 – 2012-04-18 14:20:53

1

希望這將有助於一點,你在正確的方向:

line = "<table>" + line; 
foreach (string line in lines) 
{ 
    line = "<tr><td>" + line; 
    line.Replace(",", "</td><td>"); 
    line += "</td></tr>"; 
} 
Response.Write(line + "</table>"); 

祝你學習!

+0

你錯過了一個開頭'​​'。 – BeemerGuy 2012-04-17 19:12:52

+0

除了缺少的開頭'​​',你正在做很多字符串連接,這可能會變得昂貴。最好使用StringBuilder。 – Tim 2012-04-17 19:48:34

+0

@ BeemerGuy.net真的,對不起。我寫這篇文章時門鈴響了,所以我正在衝。現在修復它。 Tim:再說一次,一個StringBuilder應該是更好的選擇。我只是想把OP指向正確的方向 - 希望他們比他/她發佈的更能理解這種方法。 – kieranajp 2012-04-17 20:48:50