次の接続文字列を使用して.csvファイルを読み取ることができないようです。
var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\countrylist.csv");
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName);
OleDbConnection oledbConn = new OleDbConnection(connectionString);
oledbConn.Open();
次のエラーが発生します。
「D:\ arrgh\arrgh\Uploads\countrylist.csv」は有効なパスではありません。パス名のスペルが正しいこと、およびファイルが存在するサーバーに接続していることを確認してください。
ファイルがそこにあることを確認しました。ここで何が起きてるの?
わかりました。もう少し掘り下げましたが、接続文字列が間違っているようです。 CSVファイルでは、実際のファイル名ではなく、ファイルが属するディレクトリを指定します。
var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\");
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName);
OleDbConnection oledbConn = new OleDbConnection(connectionString);
oledbConn.Open();
var cmd = new OleDbCommand("SELECT * FROM [countrylist.csv]", oledbConn);
そして、SelectCommandでファイル名を指定します。それを行うなんて奇妙な方法。それは今私のために働いています。
OLEDBデータプロバイダーを使用するのではなく、CSVパーサーを使用することをお勧めします。
検索すると、多くの(無料の)候補者が見つかります。これが私のために働いたいくつかです:
フラットファイル用のポータブルで効率的な汎用パーサー (最も使いやすい、IMO)
高速CSVリーダー (使いやすく、大規模なデータセットに最適)
FileHelpers ライブラリ(柔軟、コードジェネレーター、学習曲線のビットを含む)
通常、これらを使用すると、CSVのプロパティ(区切り文字、ヘッダー、テキスト修飾子など)を指定でき、メソッド呼び出しを使用して、CSVをDataTableやList <>などの何らかのデータ構造にダンプします。
CSVを使用する場合は、CSVパーサーを確認する価値があります。
C#でCSVファイルを読み込もうとしている場合、最も簡単な方法は Microsoft.VisualBasic.FileIO.TextFieldParser クラスを使用することです。サードパーティの拡張機能ではなく、実際には.NETFrameworkに組み込まれています。
はい、それはMicrosoft.VisualBasic.dll
にありますが、それはC#(または他のCLR言語)から使用できないという意味ではありません。
MSDNドキュメント から抜粋した使用例を次に示します。
Using MyReader As New _
Microsoft.VisualBasic.FileIO.TextFieldParser("C:\testfile.txt")
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(",")
Dim currentRow As String()
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
MsgBox(currentField)
Next
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & _
"is not valid and will be skipped.")
End Try
End While
End Using
繰り返しますが、この例はVB.NETにありますが、C#に変換するのは簡単です。
パスとファイル名を組み合わせる方法は、次を使用することです。
fullFilename = System.IO.Path.Combine(folderfilepath, Filename);
あなたの例では:
var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\countrylist.csv");
数週間前に同じ問題が発生し、Office 2007の自動化を実行しようとして、修正に多くの時間を費やしました。
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\"";
Dドライブがマップされたネットワークドライブである場合は、UNCパスを使用する必要がある場合があります。
\\computerName\shareName\path\