如何编写循环来读取文本文件并将其插入数据库

时间:2015-06-16 02:15:16

标签: sql-server loops powershell

我正在编写一个powershell脚本来将特定文件夹中的文本文件加载到SQL Server数据库中,我已经设法这样做,但只有一个文件由一个文件组成。我希望程序在用户输入路径和文件扩展名后自动执行此操作。

例如:

在C:\ Test路径下,我有:

  1. Test1.txt
  2. 的test2.txt
  3. Test3.txt
  4. Abcd.txt
  5. 我想让程序遍历文件并自动将其插入数据库。文件夹中的文件数量可以从10个文件到100个不等,并且每个文件的列数都不固定

    到目前为止我做了什么:

    1. 在SQL Server中创建一个存储过程,以根据文件名创建一个新表,并通过我的powershell脚本调用它。

    2. 编写了powershell脚本,需要用户输入路径,文件名和扩展名(txt,csv等),一旦捕获到详细信息,它将在SQL服务器中创建一个表。

    3. 现在,我陷入了循环过程,因为我无法弄清楚如何使程序读取Test1.txt将其插入SQL服务器然后继续读取Test2.txt将其插入SQL服务器,直到该特定文件夹中的文件结尾。

      这是脚本:

      Function AutoImportFlatFiles
      (
      $location = $(read-host "Folder Location ('C:\Test\' okay)"), 
      $file = $(read-host "File Name Without Extension ('Test1' okay)"),
      $extension = $(read-host "File Extension ('.txt' okay)"),
      $server, 
      $database
      )
      
      {
      $full = $location + $file + $extension
      $columns = Get-Content $full | Select -First 1
      $columns = $columns.Replace(" ","")
      $columns = $columns.Replace("|","] VARCHAR(2000), [")
      $table = "CREATE TABLE " + $file + "([" + $columns + "] VARCHAR(2000))"
      $connection = New-Object System.Data.SqlClient.SqlConnection
      $buildTable = New-Object System.Data.SqlClient.SqlCommand
      $insertData = New-Object System.Data.SqlClient.SqlCommand
      $connection.ConnectionString = "Data Source=" + $server + ";Database=" + $database + ";integrated security=true"
      $buildTable.CommandText = $table
      $buildTable.Connection = $connection
      ## Added to function
      $x = 0
      $insertData.CommandText = "EXECUTE stp_BulkInsert @1,@2"
      $insertData.Parameters.Add("@1", $full)
      $insertData.Parameters.Add("@2", $file)
      $insertData.Connection = $connection
      $connection.Open()
      $buildTable.ExecuteNonQuery()
      $connection.Close()
      ## Added to function
      $x = 1
      if ($x = 1)
      {
          $connection.Open()
          $insertData.ExecuteNonQuery()
          $connection.Close()
      }
      }
      AutoImportFlatFiles -server "WIN123" -database "DB_DISCOVERY"
      

1 个答案:

答案 0 :(得分:1)

要添加简单的循环,您可以使用现有的 AutoImportFlatFiles 功能,如下所示:

$Folder= $(read-host "Folder Location ('C:\Test\' okay)")
foreach ($file in (get-childitem $Folder)) {
    $location = split-path $file.FullName -Parent
    $filename = (split-path $file.FullName -Leaf).split(".")[0]
    $extension = (split-path $file.FullName -Leaf).split(".")[1]

    AutoImportFlatFiles -location $location -file $filename -extension $extension -server "WIN123" -database "DB_DISCOVERY"
}