Powershell Cut字符位置字符串

时间:2015-05-22 14:19:00

标签: string bash powershell csv cut

您如何将此BASH脚本复制到PowerShell中?它采用一个基本的字符串并抓住这些特定的块并在其间放置一个管道并将其写入csv文件。我知道怎么做get-content和输出到csv但是在powershell中删除字符串的最佳方法是什么?

22.05.2015  11:21                60 30329877_ASCII.txt
22.05.2015  14:07               122 30329877_UTF16.txt
22.05.2015  14:07               122 30329877_Good.txt
22.05.2015  14:07               128 30329877_Wrong.txt
               4 File(s)            432 bytes
==>

我之前使用过split()但似乎不是正确的方法。我正在考虑循环遍历每一行并保存该行的每一行并保存到新的字符串var并为每个部分添加分隔符。这看起来非常低效。

思想?

源文件由具有大量空格的字符位置构成。每个字段都有一定数量的字符空间。 (它基本上是一个数据库文件,但采用非常简单的txt格式)

`cat /app/$filename |cut  -c1-9,19-138,139-198,199-238,239-240,241-245,287-296 --output-delimiter="|" >> /app/CSVs/$filename.csv`

我认为使用$ string.substring(char#,length)将适用于循环,但越多越好。

输出应该看起来像

1-9 = ID (9 chars long)
19-138 = business_name (120 chars long)
139-198 = address (60 chars long)
198-237 = city (40 chars long)
238-239 = state (2 chars long)
240-244 = zip_code (5 chars long)
286-295 = phone (10 chars long)

2 个答案:

答案 0 :(得分:0)

看起来像新PS 5 cmdlet ConvertFrom-String的作业:

不幸的是,我还没有尝试过,所以我无法提供一个例子。但它也可以使用正则表达式完成:

Get-Content -Path '.\db.txt' |
    ForEach-Object{$_ -replace '^(.{9})(.{120})(.{60})(.{40})(.{2})(.{5})(.{10})$', '$1|$2|$3|$4|$5|$6|$7'} |
        Set-Content -Path '.\db.csv'

Get-Content \ Set-Contentquite slow,因此为了加快处理速度,您可以切换到StreamReader \ StreamWriter。请参阅我对这个问题的回答:More-efficient way to modify a CSV file's content,我在脚本中使用它们来加快速度。

答案 1 :(得分:0)

$subChar =0,18,138,198,238,240,286 
$subLength =9,120,60,40,2,5,10 

$file = Get-content 'C:\Users\jwannemacher\Desktop\out.txt'
Foreach($line in $file)
{
    $lineCounter
    $array = @()
    $lineLoop = 0
    $charLoop = 0

    foreach($sub in $subChar)
    {
        $word = $line.Substring($subChar[$charLoop],$subLength[$charLoop])
        $array += $word
        $charLoop++
    }
$array -join '|' | Out-File C:\file1.csv -Append