0

検索を試みましたが、この問題を理解または修正できません。

簡単に言えば。テキスト ファイルを読み取り、CSV として作成する必要があります。次の領域を除いて、物事は順調に進んでいます。

ファイルの最初の列名は、最初の文字が切り捨てられるか削られます: 例: 列名が: Musicianの場合、 usicianのようになり、その列のすべてのデータの最初の文字が切り取られます。

これは、私がこれを行うと起こります:

foreach (string line in s.Replace("\"", "").Split('\n'))

そして、次のようなコードを書くと:

foreach (string line in s.Replace("\r", "").Split('\n'))

次に、列は次のようになります: Musician"、したがって、最初の列のヘッダーを含むすべてのデータは引用符で終わります。

インデックスの位置を変更すると、ファイルの末尾にあるいくつかのデータが削られていることを除いて、すべて問題ありません。

完全なコードは次のとおりです。SSISでファイルを使用できるように、追加のReplaceメソッドを使用して追加のカンマを削除していることに注意してください。これが私がこれを必要とする主な理由です。

static void TxtToCSV(string s, TextWriter writer)
{
foreach (string line in s.Replace("\r", "").Replace(", ", "").Split('\n'))
{
    for (int i = 0; i < line.Length; i++)
    {
        if (i > 0)
            writer.Write(line[i]);
    }
    writer.WriteLine();
}
}

static void Main(string[] args)
{
TextReader reader = new StreamReader(@"C:\folder\sample\test.txt");
string a = reader.ReadToEnd();
reader.Close();

FileStream aFile = new FileStream(@"C:\folder\sample\test.csv", FileMode.Create);
TxtToCSV(a, new StreamWriter(aFile));
aFile.Close();
}

ご覧いただきありがとうございます。

4

3 に答える 3

1

行の最初の文字を書きませんでした。また、キャリッジ リターンとライン フィードの置き換えを、Environment.NewLine の 1 つの置き換えにマージしました。また、閉じる前にライターをフラッシュするか、writer.Autoflush プロパティを true に設定する必要があります。

これが私の最適化されたコードです:

    static void TxtToCSV(string s, TextWriter writer)
    {
        foreach (var line in s.Replace(", ", "").Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
        {
            foreach (var t in line)
            {
                writer.Write(t);
            }
            writer.WriteLine();
        }
        writer.Flush();
    }
于 2013-08-03T05:52:12.810 に答える
1

引用符を正しく処理しようとしているようです。投稿されたコードはこれを示していません。あなたが理解しているように、それは簡単に1つのエラーでオフになる可能性があります。

このような CSV リーダー ライブラリを使用することをお勧めします。それは機能し、おそらく現在のコードよりも高速で、確かにはるかに柔軟です。外部ライブラリの依存関係が気に入らない場合は、ソース コードを使用してプロジェクトに埋め込むことができます。非常に小さいですが、非常に優れたコードです。

于 2013-08-03T05:56:09.393 に答える
0

サンプル入力ファイルがないと正確に何をしようとしているのかを知るのは少し難しいですが、問題への答えとして、各行の文字を反復処理する目的は、最初の文字を除くすべてを出力することのようです。これは「ミュージシャン」の周りの最初の引用符を削除するために機能すると思いますが、その前に両方の引用符を削除するように変更すると、代わりにデータの最初の文字が省略されます。

于 2013-08-03T06:02:34.523 に答える