0

C# を使用して CSV ファイルを作成しています。これには 200 個のヘッダーが含まれています。150 個のヘッダーを含む別の CSV ファイルからデータを取得しています。私の問題は、ヘッダーに従ってデータを配置する方法です。たとえば、私は以下に例を挙げています。

C# で作成される CSV ファイル:

Name, Surname, Locality, DateOfbirth, Age
Joe,  Smith,                          60
Sam,  Brown,                          20

データを取得する CSV

Name, Surname, Age
Joe,  Smith,   60
Sam,  Brown,   20

これはサンプルコードです (実際のファイルには 150 個のヘッダーが含まれ、新しい CSV ファイルには 200 個のヘッダーが含まれています)

string[] lines = System.IO.File.ReadAllLines(fileUrl);
using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileUrl))
{
    foreach (string line in lines)
    {
        if (line == lines[0])
        {   
            //Changing the header of the first file
            file.WriteLine("Name, Surname, Locality, DateOfBirth, Age");
        }
        else
        {
            string[] values = line.Split(',');
            file.WriteLine(string.Format("{0},{1},{2},{3},{4}",
                                values[0], values[1], values[2], values[3], values[4]));
        } //exception being thrown here since the array is out of range
    }
}
4

2 に答える 2

2

入力ファイルから 3 列だけを読み取っていますが、5 列を書き出そうとしています。したがってvalues[3]values[4]と は範囲外になります。

Locationあなたがどこから、どこから来ると期待しているのか、私は困惑していますDateOfBirth。どこにいても、値の配列には含まれません。

于 2013-10-24T11:21:07.550 に答える
0

3 列を含むファイルからデータを読み取ります。次に、その別のファイルから Locality と DateOfBirth の値を読み取ります。最初のファイルをクリアしてから、それらすべてを新しい csv ファイルに書き込みます。

    public static List<string[]> Parse(string Path)
    {
        List<string[]> Parsed = new List<string[]>();

        using (StreamReader Reader = new StreamReader(Path))
        {
            string Line;
            char Seperator = ',';

            while ((Line = Reader.ReadLine()) != null)
            {
                if (Line.Trim().StartsWith("//")) continue;
                if (string.IsNullOrWhiteSpace(Line)) continue;

                string[] Data = Line.Split(Seperator);
                Parsed.Add(Data);
            }
        }

        return Parsed;
    } 

上記の方法を使用して、CSV ファイルから読み取ることができます。最初のファイルを読み込んで List を取得し、文字列配列に 3 つの値があるとします。

2 番目のファイルを読み取り、他の値を取得します。最初のリストの各値について、2 番目のリストで対応する項目を見つけます。次に、これら 2 つの文字列配列リストを使用して csv ファイルに書き込みます。

List<string[]> File1 = Parse("File1Path");
List<string[]> File2 = Parse("File2Path");

using (System.IO.StreamWriter file = new System.IO.StreamWriter(OutputFile))
{
   // write header first:    
   file.WriteLine("Name, Surname, Locality, DateOfBirth, Age");

   foreach (string line in File1)
   {
     var found = File2.Where(x => x[0] == line[0]).FirstOrDefault();         
     if(null == found) continue;

     file.WriteLine(string.Format("{0},{1},{2},{3},{4}",
                                line[0], line[1], found[3], found[4], line[2]));
    }
}
于 2013-10-24T11:41:02.520 に答える