web-dev-qa-db-ja.com

c#csvファイルを読み取ると有効なパスが表示されません

次の接続文字列を使用して.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」は有効なパスではありません。パス名のスペルが正しいこと、およびファイルが存在するサーバーに接続していることを確認してください。

ファイルがそこにあることを確認しました。ここで何が起きてるの?

25
sean

わかりました。もう少し掘り下げましたが、接続文字列が間違っているようです。 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でファイル名を指定します。それを行うなんて奇妙な方法。それは今私のために働いています。

57
sean

OLEDBデータプロバイダーを使用するのではなく、CSVパーサーを使用することをお勧めします。

検索すると、多くの(無料の)候補者が見つかります。これが私のために働いたいくつかです:

フラットファイル用のポータブルで効率的な汎用パーサー (最も使いやすい、IMO)
高速CSVリーダー (使いやすく、大規模なデータセットに最適)
FileHelpers ライブラリ(柔軟、コードジェネレーター、学習曲線のビットを含む)

通常、これらを使用すると、CSVのプロパティ(区切り文字、ヘッダー、テキスト修飾子など)を指定でき、メソッド呼び出しを使用して、CSVをDataTableやList <>などの何らかのデータ構造にダンプします。

CSVを使用する場合は、CSVパーサーを確認する価値があります。

4
Jay Riggs

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#に変換するのは簡単です。

2
Daniel Pryden

パスとファイル名を組み合わせる方法は、次を使用することです。

fullFilename = System.IO.Path.Combine(folderfilepath, Filename);

あなたの例では:

var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\countrylist.csv");
2
Mitch Wheat

数週間前に同じ問題が発生し、Office 2007の自動化を実行しようとして、修正に多くの時間を費やしました。

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\"";
1
Null

Dドライブがマップされたネットワークドライブである場合は、UNCパスを使用する必要がある場合があります。

\\computerName\shareName\path\
0
AaronLS