2013-02-01 51 views
-4

可能重複:
How to covert tab separated file to CSV file轉換製表符分隔的文件轉換成CSV文件在C#

我有我必須轉換成CSV文件,製表符分隔的文本文件,這一切必須是通過C#代碼完成。我的txt文件非常大(1.5 GB),因此我想快速轉換它。請幫幫我。

+4

覺得http://mattgemmell.com/2008/12/08/what-have-you-tried/ – Najzero

+0

我見過你問一對夫婦的其他問題,但沒有多少運氣得到的憤怒很多答案。請查看[常見問題]和[此鏈接](http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx)有一個很好的博客條目之一我們的主要成員寫了如何提出好問題。 – psubsee2003

+0

您的輸入(製表符分隔的文本文件)是否包含任何逗號(,)或引號(「)?如果是這樣,您可能需要一個更復雜的方法來用逗號替換它們的製表符而不破壞輸出文件 – psubsee2003

回答

1

如果你的文件的格式是嚴格的,你可以使用string.Splitstring.Join

​​
1
var csv = File.ReadAllLines("Path").Select(line => line.Replace("\t", ",")); 

你可以簡單地調用

public void ConvertToCSV(string strPath, string strOutput) 
{ 
    File.WriteAllLines(strOutput, File.ReadAllLines("Path").Select(line => line.Replace("\t", ","))); 
} 

有很多的內容已經在SO要處理.CSV文件,請先搜索或嘗試一些內容。

3

如果輸入製表符分隔文本文件中沒有任何逗號是數據的一部分,那麼它是一個非常簡單的查找和這裏取代同類其他答案:

var lines = File.ReadAllLines(path); 
var csv= lines.Select(row => string.Join(",", row.Split('\t'))); 
File.WriteAllLines(path, csv); 

但是,如果你的數據有逗號,這樣做會打破你的列,因爲你現在有額外的逗號,不應該是分隔符,但會被解釋爲這樣。如何處理它很大程度上取決於您將使用什麼應用程序來讀取CSV。

Microsoft Excel兼容的CSV將帶有逗號的字段雙引號,以確保它們被解釋爲數據而不是分隔符。這也意味着包含雙引號作爲數據的字段需要特殊處理。

我會推薦一種類似的方法與擴展方法。

var input = File.ReadAllLines(path); 
var lines = input.Select(row => row.Split('\t')); 
lines = lines.Select(row => row.Select(field => field.EscapeCsvField(',', '"')).ToArray()); 
var csv = lines.Select(row => string.Join(",", row)); 
File.WriteAllLines(path, csv.ToArray()); 

而這裏的EscapeCsvField擴展方法:

static class Extension 
{ 
    public static String EscapeCsvField(this String source, Char delimiter, Char escapeChar) 
    { 
     if (source.Contains(delimiter) || source.Contains(escapeChar)) 
      return String.Format("{0}{1}{0}", escapeChar, source); 

     return source; 
    } 
} 

此外,如果文件很大,這可能是最好不要將整個文件讀入內存中。在這種情況下,我會建議將CSV輸出寫入不同的文件,然後您可以使用StreamReaderStreamWriter,以便一次只處理1行。

var tabPath = path; 
var csvPath = Path.Combine(
       Path.GetDirectoryName(path), 
       String.Format("{0}.{1}", Path.GetFileNameWithoutExtension(path), "csv")); 

using (var sr = new StreamReader(tabPath)) 
using (var sw = new StreamWriter(csvPath, false)) 
{ 
    while (!sr.EndOfStream) 
    { 
     var line = sr.ReadLine().Split('\t').Select(field => field.EscapeCsvField(',', '"')).ToArray(); 
     var csv = String.Join(",", line); 
     sw.WriteLine(csv); 
    } 
} 

File.Delete(tabPath); 
+0

很好的答案..這一個應該得到一個支票 – NSjonas

相關問題