-3

重複の可能性:
タブ区切りファイルをCSVファイルに変換する方法

タブ区切りのテキスト ファイルを CSV ファイルに変換する必要があります。これはすべて C# コードで行う必要があります。私のtxtファイルは非常に大きい(1.5 GB)ので、すぐに変換したいです。私を助けてください。

4

3 に答える 3

5

入力タブで区切られたテキストファイルにコンマが含まれていない場合、データの一部である場合、ここでの他の回答と同様に、非常に簡単な検索と置換が可能です。

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出力を別のファイルに書き込むことをお勧めします。そうすれば、一度に1行しか使用できなくStreamReaderなります。StreamWriter

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);
于 2013-02-01T10:48:12.123 に答える
1

ファイルの形式が厳密な場合は、string.Splitandを使用できstring.Joinます。

var lines = File.ReadAllLines(path);
var newLines = lines.Select(l => string.Join(",", l.Split('\t')));
File.WriteAllLines(path, newLines);
于 2013-02-01T10:21:23.657 に答える
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 ファイルを処理するためのコンテンツが既に多数あります。まず検索するか、何かを試してください。

于 2013-02-01T10:22:08.793 に答える