正規表現でCSVをパースして、データをDataTableに格納しています。
サンプルでは、市町村等のコードのCSVファイルを開いてます。
※統計に用いる標準地域コード(http://www.stat.go.jp/index/seido/9-5.htm)
MainWindow.xaml
<Window x:Class="WpfApplication3.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="725">
<Window.CommandBindings>
<CommandBinding Command="Open" Executed="OpenCommandHandler"/>
</Window.CommandBindings>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Menu Grid.Row="0">
<MenuItem Command="Open" />
</Menu>
<DataGrid Grid.Row="1" Name="dataGrid" />
</Grid>
</Window>
MainWindow.xaml.cs
using Microsoft.Win32;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;
namespace WpfApplication3
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OpenCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == true)
{
string content = File.ReadAllText(ofd.FileName, Encoding.GetEncoding("Shift_JIS"));
DataTable dt = GetCsvDataTable(content);
this.dataGrid.ItemsSource = dt.DefaultView;
}
}
private DataTable GetCsvDataTable(string content)
{
List<List<string>> lists = new List<List<string>>();
List<string> lastList = new List<string>();
lists.Add(lastList); //1行目を追加
lastList.Add("");
Regex regex = new Regex(",|\\r?\\n|[^,\"\\r\\n][^,\\r\\n]*|\"(?:[^\"]|\"\")*\"");
MatchCollection mc = regex.Matches(Regex.Replace(content, "\\r?\\n$", ""));
foreach (Match m in mc)
{
switch (m.Value)
{
case ",":
lastList.Add("");
break;
case "\n":
case "\r\n":
//改行コードの場合は行を追加する
lastList = new List<string>();
lists.Add(lastList);
lastList.Add("");
break;
default:
if (m.Value.StartsWith("\""))
{
//ダブルクォートで囲われている場合は最初と最後のダブルクォートを外し、
//文字列中のダブルクォートのエスケープをアンエスケープする
lastList[lastList.Count - 1] =
m.Value.Substring(1, m.Value.Length - 2).Replace("\"\"", "\"");
}
else
{
lastList[lastList.Count - 1] = m.Value;
}
break;
}
}
// データテーブルにコピーする
DataTable dt = new DataTable();
for (int i = 0; i < lists[0].Count; i++)
{
dt.Columns.Add();
}
foreach (List<string> list in lists)
{
DataRow dr = dt.NewRow();
for (int i = 0; i < list.Count; i++)
{
dr[i] = list[i];
}
dt.Rows.Add(dr);
}
return dt;
}
}
}
本当にありがとう!
返信削除