2

C# を使用して CSV ファイルにデータを書き込みたいと思います。

現時点での私のコードは次のとおりです。

int length = readData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length;

List<List<string>> dataList = new List<List<string>>();

foreach (string line in readData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
{
    List<string> partsLine = new List<string>();
    partsLine.AddRange(line.Split('\t'));
    dataList.Add(partsLine);
}          

だから、私はすべてのデータを行に分割しています。

次に、各行を '\t' セパレーターで分割し、行の各部分をリストに追加します。

最後に、分割行のすべてのリストを含むリストがあります。

したがって、リストは次のようになります。

  • List1 {txt1, txt 2} = 最初の行
  • List2 {txt3, txt 4, txt 5, txt 6} = 2 行目
  • List3 {txt7, txt 8, txt 9, txt 10} = 3 行目
  • List4 {txt 11, txt 12} など

すべてのリストは、ご覧のとおり同じ長さではありません。

私がやりたいのは、すべてのリストを CSV ファイルに書き込むことです。

各リストは、リストの長さに応じて、行と特定の数の列を埋めます (つまり、txt1 は (row1, col1) である必要があり、txt2 は (row1, col2) である必要があり、txt3 は (row2, col1) である必要があります)、txt4 (row2, col2)...) になります。

どうやってやるの ?

ありがとう

4

3 に答える 3

5
List<List<String>> dataList = new List<List<string>>();
//...
const char SEPARATOR = ",";
using (StreamWriter writer = new StreamWriter("file.csv"))
{
    dataList.ForEach(line =>
    {
        var lineArray = line.Select(c =>
            c.Contains(SEPARATOR) ? c.Replace(SEPARATOR.ToString(), "\\" + SEPARATOR) : c).ToArray();
        writer.WriteLine(string.Join(SEPARATOR, lineArray));
    });
}
于 2013-06-27T09:54:56.067 に答える
1

CSVformat 自体は、可変列長の行でフォーマットされることを意図していません。 CSV(コンマ区切りの値) は「表のような」形式であるため、その規則に従う場合は、最初にすべての可能な列を定義し、行を 1 つずつ入力する必要があります。そのため、複数の行のいくつかのセルは空のままになります。

これが望ましくない場合は、カスタム形式を選択してください。

于 2013-06-27T09:52:51.473 に答える
0

.csv 形式が私のニーズに合わないことに気付いたので、このトピックに戻ってきました。

持っているすべてのデータを使用していくつかのグラフをプロットする必要がありますが、.csv ファイルはグラフの統合をサポートしていないことを読みました。したがって、List<List<string>>.csv にエクスポートする代わりに、.xls ファイルにエクスポートしたいと思います。

StreamWriter パラメータでファイルの種類を .xls に変更するだけで実行しようとしましたが、.csv のようにデータが収まりません。コードで何を変更すればよいですか?

    // Write data to a .csv file
    private void WriteToCSV(string data)
    {
        int length = data.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length;

        // List of lists containing each line split by part
        List<List<string>> dataList = new List<List<string>>();

        List<string> valuesA = new List<string>();

        // Building the list
        foreach (string line in data.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
        {
            List<string> partsLine = new List<string>();
            partsLine.AddRange(line.Split('\t'));
            dataList.Add(partsLine);
        }

        const string separator = ";";

        // Writing the list to the .csv file
        try
        {
            using (StreamWriter writer = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\output.xls", false))
            {
                dataList.ForEach(line =>
                {
                    var lineArray = line.Select(c => c.Contains(separator) ? c.Replace(separator.ToString(), "\\" + separator) : c).ToArray();
                    writer.WriteLine(string.Join(separator, lineArray));
                });
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error while writing data to .csv file (" + ex.Message + ")");
        }

写真では、以前の形式 (右側が .csv) と新しい形式 (左側が .xls) を確認できます。 http://imageshack.us/photo/my-images/850/cax.png/

于 2013-07-02T14:43:53.573 に答える