71405


開発環境 visual studio2017  
言語 C#

流れ  
◯①csvファイルを読み込む（カラム数１０件、データ数１０件）  
×②読み込んだファイルのデータを使い異なるレイアウトのcsvファイルを作成する（カラム数7件、データ数５件）＝残り2点は読み込み時に存在しない列なので空（””）にする  
読み込みサンプル

[code]

    カラム1,カラム2,カラム3,カラム4,カラム5,カラム6,カラム7,カラム8,カラム9,カラム10
    １,２,３,４,５,６,７,８,９,１０
    
[/code]

変更後  
（元CSVの列の前後は変わらず、間に新規のものが入るか、途中や後ろの列が削られるだけはなく完全にバラバラになります。）

[code]

    からむ1,カラムA,からむ2,からむ3,カラムB,からむ4,からむ5
    ”1”,””,”2”,”3”,””,”4”,”5”
    
[/code]

⬆️サンプルのレイアウトを利用して列にデータを投入するイメージです。  
カタカナと平仮名の違い＝データは同じだが、列名が異なる事を表しています  
☝️店舗名＝ショップ名など該当するデータは同じだが表記が異なる事なので値は変わりません。  
質問内容は②と③のレイアウトを変更する箇所になります。  
考え方がよく分からなかったのですが、読み込むファイルの列数とレイアウト変更後の列数は変動することは無いので不変ではなく一回設定したら常に変更の列順は固定になる想定なので  
一括でファイル読み込みしてから列の削除を行い、新規の列を作り追加した後に全体の列の順番を調整の手順でコードを作成するという考えですか？  
①読み込み

[code]

    private DataTable ReadCSV(string fp)
    {
        string[] lines = File.ReadAllLines(fp,encoding);//一括でファイル読み込み
    
        if(lines.Length>0)
        {
            foreach(string strWorld in strHeader)
            {    
                dataTable.Columns.Add(new DataColumn(strWorld));
            }
    
            for(int row=1;row<lines.Length;row++)
            {
                string[] word = lines[row].Split(',');
                DataRow dataRow = dataTable.NewRow();
                int columindex = 0;
    
                foreach(string strWorld in strHeader)
                {
                    dataRow[strWorld] = word[columindex++];
                }      
                dataTable.Rows.Add(dataRow);      
            }
        }
        return dataTable;
    }
    
[/code]


CC BY-SA 4.0
2020-10-21T15:50:39.200
71395
2020-12-21T00:40:10.417
2020-12-21T00:40:10.417
3060
42419
question
c# csv array datagridview
c＃配列を利用してCSVファイルの操作


**質問の詳細化に合わせて全面改訂：**

DataTableの各行のデータ追加は、基本的には以下の記事が参考になるでしょう。  
[DataTableの実践的な使い方](https://qiita.com/tizonaColada_99/items/9212d35722af3bd5bc9f#datatable%E3%81%AE%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9)

CSVデータファイルを読み取って通知された作業用のDataTableを基に`foreach`でループすれば良いでしょう。  
とりあえず動作確認していない概念的なものですが、以下になります。  
あるいは、ReadCSV()を汎用的に作らずに、以下を応用して専用の処理を作ることもできるでしょう。

[code]

    DataTable table = new DataTable("ResultTable"); // 結果用テーブル作成
    table.Columns.Add("からむ1", typeof(String));
    table.Columns.Add("カラムA", typeof(String));
    table.Columns.Add("からむ2", typeof(String));
    table.Columns.Add("からむ3", typeof(String));
    table.Columns.Add("カラムB", typeof(String));
    table.Columns.Add("からむ4", typeof(String));
    table.Columns.Add("からむ5", typeof(String));
    
    DataTable csvtable = ReadCSV('CSVデータファイルパス'); // CSVデータ取得
    
    foreach(DataRow csvrow in csvtable) // コピー処理
    {
        DataRow dtrow = table.NewRow();
        
        dtrow["からむ1"] = csvrow["カラム1"];
        dtrow["カラムA"] = "";
        dtrow["からむ2"] = csvrow["カラム2"];
        dtrow["からむ3"] = csvrow["カラム3"];
        dtrow["カラムB"] = "";
        dtrow["からむ4"] = csvrow["カラム4"];
        dtrow["からむ5"] = csvrow["カラム5"];
        // 入れるデータの無いカラムは特に空文字列を入れなくても良いかも？
        
        table.Rows.Add(dtrow);
    }
    
[/code]

DataGridViewへの反映や結果のCSVファイルへの出力は別途行ってください。

p.s.  
この回答へのコメントも意味が無いものになるので消しておいてください。


CC BY-SA 4.0
2020-10-22T02:58:09.270
71405
2020-10-22T07:16:55.833
2020-10-22T07:16:55.833
26370
26370
71395
answer