読者です 読者をやめる 読者になる 読者になる

ぺやろぐ

ゲームと奈々ちゃんと時々プログラミング

〔C#〕CSVのデータ内にカンマがあっても、カンマ区切りでデータを取得する

C#

完全に個人用メモ。
どこかの誰かさんの役に立てばラッキー。
立たなくても俺の役に立つからおk。
そんな記事。

目的

CSVのデータ内にカンマがあっても、カンマ区切りでデータを取得することができるようになること。
TextFieldParserの存在を知ること。

経緯

とあるテーブルの値をまるまる開発環境から本番環境に移動したかったんだけど、開発環境と本番環境でDBの場所が違う。
なので、データを手動で更新する必要が出たんだけど、テーブル削除して新しく作るのはなんか怖いしってことでデータを一旦CSVに吐き出して持っていくことになった。
ただ、このままだと1個1個手動で書き換えとか嫌なので、出力したCSVからUPDATE文を作ってやろうと考えたのが今回の始まり。

作業開始

コンソールアプリでCSVからUPDATE文を書いたテキストを吐き出すプログラムを作ることになったんだけど、「データ内にカンマあるやん。普通にカンマ区切りにしたらまずいぞこれ。」と気づく俺氏。

幸いにもダブルクォーテーションでくくられてる中にあるから、そのあたりで判断させたらいけそうやなぁと検討をつけるが、どうやるんやろとグーグル先生に質問することに。
すると、まんまそれに対応したものを見つけました!(やったね!)

先人に感謝

で、見つかったのが「TextFieldParserクラス」
以下、実際のコード

string filePath = Console.ReadLine();
string fileName = filePath.Substring(filePath.LastIndexOf('\\') + 1).Replace('"',' ');

// ファイル名と文字エンコードを指定してパーサを実体化
using (TextFieldParser txtParser =
    new TextFieldParser(
            fileName,
            Encoding.GetEncoding("shift_jis")))
{
    // 内容は区切り文字形式
    txtParser.TextFieldType = FieldType.Delimited;
    // デリミタはカンマ
    txtParser.SetDelimiters(",");

    // ファイルの終わりまで一行ずつ処理
    while (!txtParser.EndOfData)
    {
        // 一行を読み込んで配列に結果を受け取る
        splittedResult = txtParser.ReadFields();
        
        using (StreamWriter writer = 
       new StreamWriter("sql.txt", true, Encoding.GetEncoding("shift_jis")))
        {
            // ここでテキストに書き出し
        }
    }
}

TextFieldParserっていうのを使い、デリミタにカンマを指定してあげると、区切り用のカンマできれいに区切ってくれます。
あとはそれをごにょごにょするだけ。
まさか、こんな便利なものが存在するとは。
ありがたいですねぇ。

まとめ

TextFieldParserすげぇ。
あと、「タブ区切り使えや」って意見は(∩゚д゚)アーアーきこえなーい