【WPF】TextFieldParser で CSVファイルを読み込む
おはようございます。
今回は「TextFieldParser」で CSVファイルを読み込んで、データを一括登録してみたいと思います。
プログラムは前回のものを流用。
Converter を使って DataGrid に表示する値を変更する
スポンサーリンク
画面の変更
画面にCSV読込ボタンを追加します。
1 | <Button x:Name="imp_button"Content="CSV読込"HorizontalAlignment="Left"Margin="250,273,0,0"VerticalAlignment="Top"Width="75"Height="30"Click="imp_button_Click"/> |
MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <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」を追加します。
MainWindow.xaml.cs に次の記述を追加します。
MainWindow.xaml.cs
1 2 3 | usingSystem.IO; usingMicrosoft.Win32; usingMicrosoft.VisualBasic.FileIO; |
CSV読込処理の追加
更にCSV読み込みの処理を追加します。
MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /// <summary> /// CSVファイル読み込み処理 /// </summary> /// <param name="filePath"></param> /// <returns></returns> privatestaticList<Cat>readFile(stringfilePath) { FileInfo fileInfo=newFileInfo(filePath); stringret=string.Empty; List<Cat>list=newList<Cat>(); using(TextFieldParser tfp=newTextFieldParser(fileInfo.FullName,Encoding.GetEncoding("Shift_JIS"))) { tfp.TextFieldType=FieldType.Delimited; tfp.Delimiters=newstring[]{","}; tfp.HasFieldsEnclosedInQuotes=true; tfp.TrimWhiteSpace=true; while(!tfp.EndOfData) { string[]fields=tfp.ReadFields(); Cat cat=newCat(); 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); } } returnlist; } |
クリックイベント処理の追加
CSV読込ボタンをクリックした際のイベントを追加します。
MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | /// <summary> /// CSV読込ボタンクリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidimp_button_Click(objectsender,RoutedEventArgse) { OpenFileDialog ofd=newOpenFileDialog(); ofd.FileName=""; ofd.DefaultExt="*.csv"; if(ofd.ShowDialog()==false) { return; } List<Cat>list=readFile(ofd.FileName); // 接続 intcount=0; using(varconn=newSQLiteConnection("Data Source=SampleDb.sqlite")) { conn.Open(); // データを追加する using(DataContext context=newDataContext(conn)) { foreach(Cat cat inlist){ // 対象のテーブルオブジェクトを取得 vartable=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 2 3 4 5 | 1,そら,♂,6,01,犬の人形 2,りく,♂,5,02,人間 3,うみ,♀,4,03,高級ウェットフード 4,こうめ,♀,2,04,横取り 5,こなつ,♀,7,01,布団 |
CSVを読み込んでみる
データを削除した状態で、「CSV読込」ボタンをクリックします。
画像を撮り忘れましたが、
ファイル選択ダイアログが表示されるので、作成したCSVファイルを選択します。
無事に未登録のデータが登録されました。
以外に簡単にできましたね。
ソースはこちら
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません