【c#】Microsoft.Jet.OLEDB.4.0でCSVを読み込むときのファイル名に起因するエラーの対処

C#

Microsoft.Jet.OLEDB.4.0を使ってCSVファイルの読み込みをしようとするとCSVファイル名に起因するエラーが発生することがあります。
本記事では発生したエラーの内容と対処案を紹介します。

発生したエラーの内容

エラーが起きたソースコード

string sqlConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + {CSVファイルがあるフォルダーのパス} + ";Extended Properties=\"text;HDR=Yes;FMT=Delimited\"";
string commText = "SELECT * FROM [" +  {CSVファイル名(拡張子含む)} + "]";
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(sqlConnect);
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(commText, con);

DataTable CSV = new DataTable();
da.Fill(CSV);

上記ソースの{CSVファイル名(拡張子含む)} の部分にピリオド(.)が入るファイル名を指定した場合や拡張子を除いて60文字より長いCSVファイル名を指定したときにエラーが発生します。

CSVファイル名にピリオド(.)を含めた場合に発生するエラー
CSVファイル名の長さが拡張子を除いて
60文字より長い場合に発生するエラー

CSVファイル名に指定してはいけない文字はピリオド(.)以外にもあるようです。
恐らくではありますが下記のページに記述されている文字が使用できなさそうです。

Access データベースでの作業時に使用すべきでない特殊文字

エラーへの対処

あくまで一例ですが、上記のエラーに対処するためにCSVファイル名は半角英数字及びハイフン(-)、アンダーバー(_)しか受け付けず、ファイルの長さは拡張子を除いて60より長いファイルは受け付けない仕様が考えられます。

正規表現を使うと上記の仕様を実装しやすいです。
System.Text.RegularExpressions.RegexクラスのIsMatchメソッドで実現できます。

//CSVファイルの拡張子を除いた部分が半角英数字及びハイフン(-)、アンダーバー(_)で構成されているかチェック
if (System.Text.RegularExpressions.Regex.IsMatch(csvFileName.Substring(0, {CSVファイル名(拡張子含む)} .LastIndexOf(".")), @"[^a-zA-z0-9-_]") == true)
{
//ここでエラー処理をする。
}

//CSVファイル名の長さを拡張子を含めず60文字より長いかチェック
if ({CSVファイル名(拡張子含む)} .Length > 64)
{
//ここでエラー処理をする。
}

string sqlConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + {CSVファイルがあるフォルダーのパス} + ";Extended Properties=\"text;HDR=Yes;FMT=Delimited\"";
string commText = "SELECT * FROM [" +  {CSVファイル名} + "]";
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(sqlConnect);
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(commText, con);

DataTable CSV = new DataTable();
da.Fill(CSV);

参考になれば幸いです。

タイトルとURLをコピーしました