BETA

【WPF】TextFieldParser で CSVファイルを読み込む

投稿日:2019-03-27
最終更新:2019-03-27
※この記事は外部サイト(https://www.doraxdora.com/blog/2017/06/29/...)からのクロス投稿です

今回は「TextFieldParser」で CSVファイルを読み込んで、データを一括登録してみたいと思います。

プログラムは前回のものを流用。
Converter を使って DataGrid に表示する値を変更する

画面の変更

画面にCSV読込ボタンを追加します。

<Button x:Name="imp_button" Content="CSV読込" HorizontalAlignment="Left" Margin="250,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="imp_button_Click"/>  
</pre>  
MainWindow.xaml  
<pre class="lang:xhtml decode:true"><Window x:Class="WpfApp1.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        xmlns:local="clr-namespace:WpfApp1"  
        mc:Ignorable="d"  
        Title="一覧" Height="350" Width="530">  
    <Window.Resources>  
        <ResourceDictionary Source="/Style/StyleDic.xaml"/>  
    </Window.Resources>  

    <Grid>  
        <Grid.Resources>  
            <local:KindConverter x:Key="KindConv"/>  
        </Grid.Resources>  
        <Label Content="名前:" Margin="10,10,0,0" Style="{StaticResource lb-normal}"/>  
        <TextBox x:Name="search_name" Margin="56,12,0,0" Style="{StaticResource tx-normal}"/>  
        <Label Content="種別:" Margin="201,10,0,0" Style="{StaticResource lb-normal}"/>  
        <ComboBox x:Name="search_kind" Margin="252,12,0,0" Style="{StaticResource cb-normal}"/>  
        <Button x:Name="search_button" Content="検索" Margin="432,12,0,0" Style="{StaticResource btn-normal}" Click="search_button_Click"/>  

        <DataGrid Name="dataGrid" HorizontalAlignment="Left" Margin="10,43,0,0" Width="497" Height="225" Style="{StaticResource grid-normal}" >  
            <DataGrid.Columns>  
                <DataGridTextColumn Binding="{Binding No}" ClipboardContentBinding="{x:Null}" Header="No" IsReadOnly="True" Width="50"/>  
                <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="名前" IsReadOnly="True" Width="100"/>  
                <DataGridTextColumn Binding="{Binding Sex}" ClipboardContentBinding="{x:Null}" Header="性別" IsReadOnly="True" Width="40"/>  
                <DataGridTextColumn Binding="{Binding Age}" ClipboardContentBinding="{x:Null}" Header="年齢" IsReadOnly="True" Width="40"/>  
                <DataGridTextColumn Binding="{Binding Kind, Converter={StaticResource KindConv}}" ClipboardContentBinding="{x:Null}" Header="種別" IsReadOnly="True" Width="120"/>  
                <DataGridTextColumn Binding="{Binding Favorite}" ClipboardContentBinding="{x:Null}" Header="好物" IsReadOnly="True" Width="*"/>  
            </DataGrid.Columns>  
        </DataGrid>  
        <Button x:Name="add_button" Content="追加" HorizontalAlignment="Left" Margin="10,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="add_button_Click"/>  
        <Button x:Name="upd_button" Content="更新" HorizontalAlignment="Left" Margin="90,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="upd_button_Click"/>  
        <Button x:Name="del_button" Content="削除" HorizontalAlignment="Left" Margin="170,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="del_button_Click"/>  
        <Button x:Name="imp_button" Content="CSV読込" HorizontalAlignment="Left" Margin="250,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="imp_button_Click"/>  
    </Grid>  
</Window>  

参照ライブラリの追加

参照の追加から「Microsoft.VisualBasic.FileIO」を追加します。

MainWindow.xaml.cs に次の記述を追加します。

MainWindow.xaml.cs

using System.IO;  
using Microsoft.Win32;  
using Microsoft.VisualBasic.FileIO;  

CSV読込処理の追加

更にCSV読み込みの処理を追加します。

MainWindow.xaml.cs

        /// <summary>  
        /// CSVファイル読み込み処理  
        /// </summary>  
        /// <param name="filePath"></param>  
        /// <returns></returns>  
        private static List<Cat> readFile(string filePath)  
        {  
            FileInfo fileInfo = new FileInfo(filePath);  
            string ret = string.Empty;  
            List<Cat> list = new List<Cat>();  
            using (TextFieldParser tfp = new TextFieldParser(fileInfo.FullName, Encoding.GetEncoding("Shift_JIS")))  
            {  
                tfp.TextFieldType = FieldType.Delimited;  
                tfp.Delimiters = new string[] { "," };  
                tfp.HasFieldsEnclosedInQuotes = true;  
                tfp.TrimWhiteSpace = true;  
                while (!tfp.EndOfData)  
                {  
                    string[] fields = tfp.ReadFields();  
                    Cat cat = new Cat();  
                    cat.No = int.Parse(fields[0]);  
                    cat.Name = fields[1];  
                    cat.Sex = fields[2];  
                    cat.Age = int.Parse(fields[3]);  
                    cat.Kind = fields[4];  
                    cat.Favorite = fields[5];  
                    list.Add(cat);  
                }  
            }  
            return list;  
        }  

クリックイベント処理の追加

CSV読込ボタンをクリックした際のイベントを追加します。

MainWindow.xaml.cs

           /// <summary>  
            /// CSV読込ボタンクリックイベント.  
            /// </summary>  
            /// <param name="sender"></param>  
            /// <param name="e"></param>  
            private void imp_button_Click(object sender, RoutedEventArgs e)  
            {  
                OpenFileDialog ofd = new OpenFileDialog();  
                ofd.FileName = "";  
                ofd.DefaultExt = "*.csv";  
                if (ofd.ShowDialog() == false)  
                {  
                    return;  
                }  

                List<Cat> list = readFile(ofd.FileName);  

                // 接続  
                int count = 0;  
                using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite"))  
                {  
                    conn.Open();  

                    // データを追加する  
                    using (DataContext context = new DataContext(conn))  
                    {  
                        foreach (Cat cat in list) {  
                            // 対象のテーブルオブジェクトを取得  
                            var table = context.GetTable<Cat>();  
                            // データが存在するかどうか判定  
                            if (table.SingleOrDefault(x => x.No == cat.No) == null)  
                            {  
                                // データ追加  
                                table.InsertOnSubmit(cat);  
                                // DBの変更を確定  
                                context.SubmitChanges();  
                                count++;  
                            }  
                        }  
                    }  
                    conn.Close();  
                }  

                MessageBox.Show(count + " / " + list.Count + " 件 のデータを取り込みました。");  

                // データ再検索  
                searchData();  
            }  

CSVの作成

読み込むCSVファイルを作成します。

次の内容をファイルにコピペし、「データ.csv」などという名前で保存します。

    1,そら,♂,6,01,犬の人形  
    2,りく,♂,5,02,人間  
    3,うみ,♀,4,03,高級ウェットフード  
    4,こうめ,♀,2,04,横取り  
    5,こなつ,♀,7,01,布団  

CSVを読み込んでみる

データを削除した状態で、「CSV読込」ボタンをクリックします。

画像を撮り忘れましたが、
ファイル選択ダイアログが表示されるので、作成したCSVファイルを選択します。

無事に未登録のデータが登録されました。

以外に簡単にできましたね。

ではでは。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!