使用PowerShell将查询到的数据导出到CSV文件

本文中以SQL Server查询语句为例

  • 第一步:在微软的SSMS中写要查询的语句
select '質問日時','質問ID','相談カテゴリ名','質問タイトル','質問本文','回答日時','回答ID','回答者','回答内容'
union all
select top 100 
cast(q.InsertDt as nvarchar(30)),cast(q.QuestionId as nvarchar(20)),mc.category_name,c.Title,q.QuestionBody,
cast(a.AnswerDt as nvarchar(30)),cast(a.AnswerId as nvarchar(30)),ma.answerer_nickname,a.AnswerBody
from Questions as q
join Answers as a
on q.QuestionId=a.QuestionId
join Counselings as c
on q.CounselingId=c.CounselingId
join m_category as mc
on c.CategoryId=mc.category_id
join m_answerer as ma
on AnswererId=ma.answerer_id
where
c.QaOpenFlg=1
and CONVERT(varchar(10),q.InsertDt,120) <CONVERT(varchar(10),GETDATE(),120)
  • 查询语句说明:
    1、第一个select是设置想要显示的字段名,注意个数要和第二个select中实际选择的字段个数相同
    2、union all一定要有
    3、第二个select中选择的字段如果类型不是char类型的,必须强制转换为char类型,否则你试试

  • 第二步:将有效的sql语句放入shell脚本中
    (这段脚本我也不太懂,用的是别人给的模板)

#使用当前的时间来创建文件夹
$usedate = "{0:yyyyMMddHHmmss}" -f (get-date)
md F:\tmp\$usedate
md F:\tmp\$usedate\converted

function Convert {
    param(
      [String]$in = "F:\tmp\$usedate",
      [String]$out = "F:\tmp\$usedate\converted",
      [String]$from = "Unicode",
      [String]$to = "UTF-8"
    )

    # 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
    $enc_f = [Text.Encoding]::GetEncoding($from)
    $enc_t = [Text.Encoding]::GetEncoding($to)
    # 与えられたパス(c:\tmp\convert)から合致するファイルリストを再帰的に取得
    Get-ChildItem $in -recurse |
    # 取得したファイルを順番に処理
    ForEach-Object {
        # 取得したオブジェクトがファイルの場合のみ処理(フォルダの場合はスキップ)
        if($_.GetType().Name -eq "FileInfo") {
            # 変換元ファイルをStreamReaderオブジェクトで読み込み
            $reader = New-Object IO.StreamReader($_.FullName, $enc_f)
            # 保存先のパス、保存先の親フォルダのパスを生成
            $o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
            $o_folder = Split-Path $o_path -parent
            # 保存先のフォルダが存在しない場合にフォルダを自動生成
            if(!(Test-Path $o_folder)) {
                [Void][IO.Directory]::CreateDirectory($o_folder)
            }
            # 保存先ファイルをStreamWriterオブジェクトでオープン
            $writer = New-Object IO.StreamWriter($o_path, $false, $enc_t)
            # 変換元ファイルを順に読み込み、保存先ファイルに書き込み
            while(!$reader.EndOfStream){$writer.WriteLine($reader.ReadLine())}
            # ファイルをすべてクローズ
            $reader.Close()
            $writer.Close()
        }
    }
}
bcp "select '質問日時','質問ID','相談カテゴリ名','質問タイトル','質問本文','回答日時','回答ID','回答者','回答内容'
union all
select top 1000
cast(q.InsertDt as nvarchar(30)),cast(q.QuestionId as nvarchar(20)),mc.category_name,c.Title,q.QuestionBody,
cast(a.AnswerDt as nvarchar(30)),cast(a.AnswerId as nvarchar(30)),ma.answerer_nickname,a.AnswerBody
from Questions as q
join Answers as a
on q.QuestionId=a.QuestionId
join Counselings as c
on q.CounselingId=c.CounselingId
join m_category as mc
on c.CategoryId=mc.category_id
join m_answerer as ma
on AnswererId=ma.answerer_id
where
c.QaOpenFlg=1
and CONVERT(varchar(10),q.InsertDt,120) <CONVERT(varchar(10),GETDATE(),120)" queryout "F:\tmp\$usedate\VQuestions_unicode.csv" -w -t "\t" -S jejebcqbng.database.windows.net -d devkaramedy -U karamedy -P Hyron2012 
Convert "F:\tmp\$usedate\VQuestions_unicode.csv" "F:\tmp\$usedate\converted\VQuestions_utf8.csv"

gc "F:\tmp\$usedate\converted\VQuestions_utf8.csv" -ReadCount 100 | %{
    $_ -replace "^","""" -replace "$","""" -replace "`t",""",""" -replace ",""""","," | Out-File -FilePath "F:\tmp\$usedate\converted\VQuestions.csv" -Encoding utf8 -Append
}

gci * -Include VQuestions* | %{del $_}
del F:\tmp\$usedate\converted
  • 说明:
    该脚本是获取当前的时间来自动生成文件夹的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值