首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Powershell脚本将大量大型.CSV文件异步导入到远程数据库中

通过Powershell脚本将大量大型.CSV文件异步导入到远程数据库中
EN

Stack Overflow用户
提问于 2014-02-22 21:01:18
回答 1查看 944关注 0票数 0

我正在尝试将存储在.csv文件中的大量数据上传到远程MSSQL。

我找到了有效的解决方案(至少对于同步模式) here

我试图通过Powershell作业以异步模式启动part,但失败了。

下面是代码:

代码语言:javascript
复制
Get-ChildItem "G:\Data\*.csv" | % {

Start-job -Name "$($_)" -InitializationScript  {Ipmo Functions -Force -DisableNameChecking} `
-ScriptBlock { $DataImport = Import-Csv -Path $args[0]
               $DataTable = Out-DataTable -InputObject $DataImport
               Write-DataTable -ServerInstance "MSSQL" `
                              -Database "database" `
                             -TableName "table" `
                                -Username "user" `
                              -Password "pwd" `
                              -Data $DataTable
 } -ArgumentList $_.fullname}

我收到错误:

Ipmo :未加载指定的模块“”Functions“”,因为在任何模块目录中都找不到有效的模块文件。“第1行:1 char:1 + Ipmo Functions -Force -DisableNameChecking + ~~ + CategoryInfo : ResourceUnavailable:(Functions:String)导入模块,FileNotFoundException + FullyQualifiedErrorId : Modules_ModuleNotFound,String

有人能帮帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 2014-02-23 03:15:17

以这种方式使用Start-Job处理这些文件,而不限制您正在创建的作业的数量,可能不会有很好的性能。也就是说,如果有1000个CSV文件,您将创建1000个工作岗位。如果您使用的是PowerShell V3或更高版本,则可以尝试使用工作流来获得更“托管”的并行执行:

代码语言:javascript
复制
workflow Process-CsvFile([string[]]$Files) {
    InlineScript { Import-Module Functions -DisableNameCheck }
    foreach -parallel($file in $Files) {
        InlineScript {
            $DataImport = Import-Csv -Path $args[0]
            $DataTable = Out-DataTable -InputObject $DataImport
            Write-DataTable -ServerInstance "MSSQL" `
                            -Database "database" `
                            -TableName "table" `
                            -Username "user" `
                            -Password "pwd" `
                            -Data $DataTable
        } 
    }
}

$files = Get-ChildItem G:\Data\*.csv| Foreach FullName
Process-CsvFile $files

关于您关于导入函数的错误的问题。需要将Out-DataTableWrite-DataTable函数复制到名为Functions.psm1的文件中,该文件应该放在以下两个位置之一:$home\Documents\WindowsPowerShell\Modules\Functions\Functions.psm1$pshome\Modules\Functions\Functions.psm1。我建议把它放在第一个位置,在你的home目录下。将文件放到正确的位置后,打开PowerShell并执行ipmo Functions -DisableNameChecking,以验证您没有收到错误。

如果你不想并行执行,那么你需要修改你使用Start-Job的方式,因为这些作业是并行运行的。创建单个作业以在后台按顺序运行CSV文件,例如:

代码语言:javascript
复制
$files = Get-ChildItem G:\Data\*.csv| Foreach FullName
Start-job -Name ProcessCsvFiles`
          -InitializationScript  {Ipmo Functions -Force -DisableNameChecking} `
          -ScriptBlock {param($files) 
               foreach ($file in $files) {
                   $DataImport = Import-Csv -Path $file
                   $DataTable = Out-DataTable -InputObject $DataImport
                   Write-DataTable -ServerInstance "MSSQL" `
                                   -Database "database" `
                                   -TableName "table" `
                                   -Username "user" `
                                   -Password "pwd" `
                                   -Data $DataTable
               }
           } -ArgumentList $files
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21954683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档