【问题标题】:how to concatenate the contents of all files in a directory by name order?如何按名称顺序连接目录中所有文件的内容?
【发布时间】:2021-12-13 19:24:15
【问题描述】:

我有一堆文本文件需要连接成一个字符串:

最终结果是20211026_113900.sql + 20211027_083900.sql + 20211027_093900.sql的内容串联

我们如何连接文件的内容以确保字母顺序?

20211026_113900.sql

从 mytable1 中选择名称 GO

20211027_083900.sql

从 mytable2 GO 中选择名称

20211027_093900.sql

从 mytable3 GO 中选择名称

我期待的最终结果是:

从 mytable1 中选择名称 GO 从 mytable2 中选择名称 GO 选择名称 从 mytable3 去

【问题讨论】:

    标签: powershell concatenation


    【解决方案1】:

    Get-ChildItem枚举所有文件:

    $files = Get-ChildItem -Path path\to\Scripts -File -Filter *.sql 
    

    文件系统提供程序已按排序顺序返回它们,但您可以使用 Sort-Object 显式按名称对它们进行排序,如果它让您更舒服的话:

    $files = $files |Sort-Object -Property Name
    

    最后使用Get-Content -Raw将文件内容读入内存,并使用-join操作符加入:

    $concatenated = @(
        $files |Get-Content -Raw
    ) -join [Environment]::NewLine
    

    $concatenated 现在包含一个多行字符串,其中包含由换行符分隔的所有 *.sql 文件的内容

    [Environment]::NewLine 替换为' ' 以将它们连接到与前一个文件相同的行上,或者在一元模式下使用-join

    $concatenated = -join @(
        $files |Get-Content -Raw
    )
    

    【讨论】:

    • 做得很好(“如果它让你更舒服”是一个很好的接触:)。至于一元 -join 解决方案/加入换行符:鉴于 -Raw 也返回文件的尾随换行符,并且文本文件通常有尾随换行符,一元 -join 将可能会导致 no 内容在同一行,相反,加入换行符可能会导致各个文件的内容之间出现空行。像($files |Get-Content -Raw).TrimEnd("`r`n") -join [Environment]::NewLine 这样的东西会导致可预测的分离。
    • 出于好奇:您是否出于概念原因使用@(...),以便明确-join 的LHS 是一个数组? (-join 也接受标量 LHS,适当地导致无操作)。
    • @mklement0 这只是我试图巧妙表达意图的另一种情况 - 我必须创建一个子表达式无论如何(以免我想将文件内容存储在变量中) ,并且@(...) 的选择在这里似乎是合适的 - 它表明我们正在做-join 因为我们期望大量文件:)
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2020-10-23
    • 2014-10-08
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多