C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: タブ区切りファイルの列と行を入れ替えてリストに格納する方法


(過去ログ 158 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■91793 / inTopicNo.1)  タブ区切りファイルの列と行を入れ替えてリストに格納する方法
  
□投稿者/ 河童 (59回)-(2019/08/03(Sat) 23:51:58)

分類:[C#] 

いつも大変お世話になっております。

タブ区切りファイルの列と行を入れ替えてリストに格納する方法について教えてください。

ファイルの内容:
HEAD HEAD1 jump HEAD3
DATA DATA1      DATA3

ファイルは必ず2行で、各行の要素数も同じです。

リストに格納する形は、
HEDA DATA
HEAD1 DATA1
HEAD2 DATA2
上記のように、行と列を入れ替えて、HEADの値(jump)によっては除外します。
IF文で判定しています。


わからないことは、1行目と2行目をどのように紐づけるかです。
1行目と2行目はそれそれ読込むことはできます。
行数の判定もできます。

2行目の値をすでにリストに格納されている1行目の値に紐づけてリストに格納する方法がわかりません。

どのように行と列を入れ替えてリストに格納すれば良いでしょうか?


       public class dgvCSVDetailLst
        {
            public dgvCSVDetailLst();
            public string head_id { get; set; }
            public string data_data { get; set; }
            
        }

        public static List<dgvCSVDetailLst> CSVDataList = new List<dgvCSVDetailLst>();
  
        void Create_DgvCsvDetailLst(string pfile)
        {

            // CSVファイルデータの読み込み
            StreamReader sr = new StreamReader(@pfile, System.Text.Encoding.GetEncoding("shift_jis"));
            try
            {
                int line_cnt = 0;

                // 末尾まで繰り返す
                while (sr.EndOfStream == false)
                {
                    // CSVファイルの一行を読み込む
                    string line = sr.ReadLine();
                    // タブ区切りで分けて配列に格納する
                    string[] values = line.Split('\t');

                    if (line_cnt == 0)
                    {

                        // 配列からリストに格納する
                        foreach (string value in values)
                        {
                            dgvCSVDetailLst d = new dgvCSVDetailLst();

                            // 1行目の値を判定:条件はいろいろあります
                            if (value != "")
                            {
                                // 1行目の値をセット
                                d.head_id = value;
                                // 2行目の値をセット:わからない点
                                d.data_data = "";

                                CSVDataList.Add(d);
                            }
                        }
                    }
                    line_cnt = line_cnt + 1;
                }
            }
            finally
            {
                sr.Close();
            }

        }

引用返信 編集キー/
■91794 / inTopicNo.2)  Re[1]: タブ区切りファイルの列と行を入れ替えてリストに格納する方法
□投稿者/ KOZ (17回)-(2019/08/04(Sun) 09:00:32)
No91793 (河童 さん) に返信
> リストに格納する形は、
> HEDA DATA
> HEAD1 DATA1
> HEAD2 DATA2

HEAD3 , DATA3 は?

とまあ、それは置いといて、CSVの列が行、CSV の行が列なので、それぞれカウンタを作成すると良いです。

static void Create_DgvCsvDetailLst(string pfile) {
    StreamReader sr = new StreamReader(pfile, System.Text.Encoding.GetEncoding("shift_jis"));
    try {
        int columnCount = 0;
        while (!sr.EndOfStream) {
            string line = sr.ReadLine();
            string[] values = line.Split('\t');
            int rowCount = 0;
            foreach (var value in values) {
                switch (columnCount) {
                    case 0:
                        dgvCSVDetailLst d = new dgvCSVDetailLst();
                        if (value !="jump") {
                            d.head_id = value;
                            CSVDataList.Add(d);
                        }
                        break;
                    case 1:
                        if (value != "") {
                            CSVDataList[rowCount].data_data = value;
                            rowCount++;
                        }
                        break;
                }
            }
            columnCount++;
        }
        foreach (var d in CSVDataList) {
            System.Diagnostics.Debug.Print($"{d.head_id}, {d.data_data}");
        }
    } finally {
        sr.Close();
    }
}

無視する条件が複雑なら、いったん格納して後から削除するのもありかもしれません。

引用返信 編集キー/
■91824 / inTopicNo.3)  Re[2]: タブ区切りファイルの列と行を入れ替えてリストに格納する方法
□投稿者/ 河童 (60回)-(2019/08/06(Tue) 13:08:37)
No91794 (KOZ さん) に返信

KOZ さん、お返事ありがとうございます。

条件が複数になりそうなので、データをいったん格納して後から削除するようにしました。
考え方がすっきりしました。


無視する条件が複雑なら、いったん格納して後から削除するのもありかもしれません。

        void Create_DgvCsvDetailLst(string pfile)
        {

            // CSVファイルデータの読み込み
            StreamReader sr = new StreamReader(@pfile, System.Text.Encoding.GetEncoding("shift_jis"));
            try
            {
                int line_cnt = 1;

                string[] head_values = null;
                string[] data_values = null;


                // 末尾まで繰り返す
                while (!sr.EndOfStream)
                {
                    // CSVファイルの一行を読み込む
                    string line = sr.ReadLine();

                    if (line_cnt == 1)
                    {
                        // 1行目(ヘッダ)
                        head_values = line.Split('\t');
                    }
                    else
                    {
                        // 2行目(データ)
                        data_values = line.Split('\t');
                    }

                    line_cnt++;
                }

                // ヘッダとデータをリストに格納(ヘッダの要素分だけ繰り返し)
                // ※ヘッダとデータの要素数は同じことが前提
                for (int i = 0; i < head_values.Length; i++)
                {
                    dgvCSVDetailLst d = new dgvCSVDetailLst();

                  
                    // ヘッダの要素
                    d.head_value = head_values[i];
                    // データの要素
                    d.data_value = data_values[i];
                   
                    DgvCSVDetailLst.Add(d);

                }

            }
            finally
            {
                sr.Close();
            }

        }

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -