【问题标题】:Keep decimal precision when PowerShell Access.Application Transfertext exports Number column to CSV filePowerShell Access.Application Transfertext 将数字列导出到 CSV 文件时保持小数精度
【发布时间】:2020-01-02 01:15:52
【问题描述】:

我在 Windows 2012 R2 服务器上使用 powershell 将数据从 Access 表导出到 CSV 文件。我想在不修改 Access 数据库架构且不在 a​​ccess 数据库中编写任何 VBA 代码的情况下执行此操作。

powershell 脚本归结为如下内容:

$Table = 'tblUsers'
$Filepath = 'C:\tblUsers.csv'
$Acc = New-Object -Com Access.Application
$Acc.OpenCurrentDataBase($DBFilePath)
$Acc.DoCmd.Transfertext(2, [Type]::Missing, $Table, $Filepath, 1)

其中一个表有一列包含数字字段,其中字段大小为双倍,格式为百分比,小数位数设置为 2。该字段包含 100%50%87.5% 等值.当我运行此命令时,CSV 中 100% 值的输出为,1.00,,而87.5% 的输出为,0.87,。似乎这个过程中的某些东西正在降低这些列的显着精度。

脚本中有没有办法确保我获得数据库中每一列的所有有效数字?还有其他类型的列需要担心吗?

我知道有 2 个解决方案有缺点:

如果可能的话,我想要一个新的答案而不是这两个答案。这两个答案有很大的缺点。

  1. From this forum thread:更改计算机上的语言设置,使其显示更多(最多 9 位)小数。我不希望整个计算机的十进制设置必须更改,并且我不想只在 9 而不是 2 处设置新的限制 - 如果数据库中的数字在小数点后有 15 个有效数字怎么办?李>
  2. 使用查询指定数据并将数字转换为字符串。这样做的缺点是需要我检查每列的定义并为每个表编写查询。我要导出 30 多个包含数百列的表,所以这将是太多的工作。

【问题讨论】:

  • 在定义具有您提到的确切类型的数字列后,我无法重现。并使用相同的参数导出。 CSV 数据为所有行保留两位小数。请务必在文本编辑器中检查输出(不是可以在打开时应用格式的 Excel)。
  • @Parfait 感谢您为重现该问题所做的工作。我正在 Mac 和 Linux 机器上使用 grep 检查生成的 CSV 文件。你在 Windows 2012 上吗?如果您进入控制面板更改语言设置,使数字有 2 位小数,您仍然会得到输出中的所有数字吗?
  • 我不认为这是重复的,因为它是关于 PowerShell 而不是关于 VBA,但也许我只是对 PowerShell 和 VBA 了解不够,不知道可以在 Powershell 中应用相同的技术?
  • 也许这个链接对Use powershell to create queries in MS-Access有帮助

标签: powershell ms-access export-to-csv


【解决方案1】:

此代码应导出结果,而无需对 Access 表或计算机设置进行任何修改。

1) 它使用Microsoft.Jet.OLEDB.4.0 driver

2) 唯一的限制是它必须通过PowerShell x86due to this limitation 运行。或者,您可以安装 64 位驱动程序(帖子中的链接)。

此访问表 (tblFruit) 有 3 个字段:

  • ID - 自动编号
  • 水果 - 短文
  • 百分比 - 数字,字段大小:双精度,格式:百分比,小数位数:2。

$csvPath = 'C:\temp\output.csv'
$dbPath = 'C:\temp\database1.mdb'
$strQuery = "SELECT * from tblFruit"

$strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=$dbPath"

$connection = New-Object -TypeName System.Data.OleDb.OleDbConnection
$connection.ConnectionString = $strConn 
$command = $connection.CreateCommand()
$command.CommandText = $strQuery
$adapter = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $command
$dataset = New-Object -TypeName System.Data.DataSet
$adapter.Fill($dataset)
$dataset.Tables[0] | export-csv $csvPath -NoTypeInformation
$connection.Close()

输出:

"ID","Fruit","Percent"
"1","Apple","0.0142"
"2","Orange","0.3412"
"3","Banana","0.8715"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多