PowerShell使用ODBC读取.csv文件报错:数据源名称未找到
解决PowerShell无DSN读取CSV时的ODBC驱动错误
问题现象
执行PowerShell代码读取CSV时触发以下错误:
[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
用户代码:
$SourceFolder = [String]::Format("{0}\Data\Source\", ".") $driver = "Microsoft Access Text Driver (*.txt;*.csv)" $connectionString = [String]::Format("Driver={0};Dbq={1};Extensions=csv,txt;", $driver, $SourceFolder) $odbcConnection = New-Object System.Data.Odbc.OdbcConnection($connectionString) $odbcConnection.Open()
已确认系统存在64位Microsoft Access Text Driver (*.txt, *.csv)驱动,尝试过创建schema.ini、重启、调整连接字符串、更换路径等操作无效,仅DSN方式可正常工作,但需避免使用DSN。
解决方案
1. 严格匹配驱动名称
ODBC驱动管理器对驱动名称的符号、空格完全敏感,代码中驱动名使用了分号;,但实际驱动名称是逗号,。需从Get-OdbcDriver输出复制精确名称:
# 获取系统中存在的精确驱动名称 $driver = (Get-OdbcDriver -Name "Microsoft Access Text Driver (*.txt, *.csv)").Name
2. 使用绝对路径作为数据源目录
相对路径可能导致ODBC驱动解析失败,改用绝对路径:
$SourceFolder = Join-Path (Get-Location) "Data\Source"
3. 正确转义连接字符串中的特殊字符
驱动名称包含空格和括号,需用反引号"转义双引号,确保连接字符串被正确解析:
$connectionString = "Driver=`"$driver`";Dbq=`"$SourceFolder`";Extensions=csv,txt;"
4. 确认PowerShell运行位数
确保使用64位PowerShell运行代码(右键选择「Windows PowerShell (x64)」),避免32位环境无法识别64位驱动。
修正后的完整代码
# 获取精确驱动名称 $driver = (Get-OdbcDriver -Name "Microsoft Access Text Driver (*.txt, *.csv)").Name # 生成绝对数据源路径 $SourceFolder = Join-Path (Get-Location) "Data\Source" # 构建转义后的连接字符串 $connectionString = "Driver=`"$driver`";Dbq=`"$SourceFolder`";Extensions=csv,txt;" $odbcConnection = New-Object System.Data.Odbc.OdbcConnection($connectionString) try { $odbcConnection.Open() Write-Host "CSV数据源连接成功" } catch { Write-Error "连接失败: $_" } finally { # 确保资源释放 $odbcConnection.Close() $odbcConnection.Dispose() }
额外排查项
若仍无法连接,可尝试添加Extended Properties参数指定文本格式:
$connectionString = "Driver=`"$driver`";Dbq=`"$SourceFolder`";Extensions=csv,txt;Extended Properties=`"text;HDR=Yes;FMT=Delimited`";"
内容的提问来源于stack exchange,提问作者Serge Fonville
相关产品推荐
相关产品推荐

