遍历 SQL 中的行以输出到文本文件

Iterate through Rows in SQL to Output to Text File

我有一个 SQL table,其中包含数百行数据。此 table 中的其中一列包含以纯文本形式存储在该列中的文本报告。

本质上,我需要遍历 SQL 中的每一行数据,并将每一行的报告列的内容输出到它自己的单独的文本文件,并使用从另一列中提取的唯一名称。

我正在尝试通过 PowerShell 完成此操作,但我似乎被挂断了。以下是我到目前为止的内容。

foreach ($i=0; $i -le $Reports.Count; $i++)
{
  $SDIR = "C:\harassmentreports"
  $FILENAME = $Reports | Select-Object FILENAME
  $FILETEXT = $Reports | Select-Object TEXT
  $NAME = "$SDIR$FILENAME.txt"
  if (!([System.IO.File]::Exists($NAME))) {
    Out-File $NAME | Set-Content -Path $FULLFILE -Value $FILETEXT
  }
}

假设 $Reports 是您的 SQL 查询中的记录列表,您需要解决以下问题:

  • 在索引循环中使用对数组元素的索引访问:

    $FILENAME = $Reports<b>[$i]</b> | Select-Object FILENAME
    $FILETEXT = $Reports<b>[$i]</b> | Select-Object TEXT
    
  • 如果变量的值在循环内不变,则在循环外定义变量:

    <b>$SDIR = "C:\harassmentreports"</b>
    foreach ($i=0; $i -le $Reports.Count; $i++) {
      ...
    }
    
  • 如果要使用它们的值,请展开属性:

    $FILENAME = $Reports[$i] | Select-Object <b>-Expand</b> FILENAME
    $FILETEXT = $Reports[$i] | Select-Object <b>-Expand</b> TEXT
    
  • 使用Join-Path构建路径:

    $NAME = Join-Path $SDIR "$FILENAME.txt"
    
  • 使用Test-Path检查文件或文件夹是否存在:

    if (-not (Test-Path -LiteralPath $NAME)) {
      ...
    }
    
  • 使用Out-File

    Out-File -FilePath $NAME -InputObject $TEXT
    

    Set-Content

    Out-File -Path $NAME -Value $TEXT
    

    不是他们两个。这两个 cmdlet 之间的基本区别在于它们的默认编码。前者采用Unicode,后者采用ASCII编码。两者都允许您通过参数 -Encoding.

  • 更改编码

您可能还想重新考虑首先使用 for 循环。 pipeline with a ForEach-Object 循环可能是更好的方法:

$SDIR = "C:\harassmentreports"
$Reports | ForEach-Object {
  $file = Join-Path $SDIR ($_.FILENAME + '.txt')
  if (-not (Test-Path $file)) { Set-Content -Path $file -Value $_.TEXT }
}