【问题标题】:another line split (powershell or other scripting tools under windows)另一行拆分(powershell或windows下的其他脚本工具)
【发布时间】:2012-03-21 03:30:37
【问题描述】:

我手头有一个日志文件,如下所示: 0226 111641 (1911) 0 一些包含任何字母和标记的空格分隔消息

当需要排除故障时,我需要将其导入数据库,以便在其上使用过滤器。目前我认为 powershell 是实现这一目标的最佳选择,但我太绿了,不知道具体如何去做,所以它可以实际执行。我试着这样做:

$file = Get-Content "test.txt"

foreach ($line in $file)
    {
    #Write-Host $line
    $a = $line
    $month1 = $a[0..1]
    $month2 = "$month1"
    $month2 = $month2.ToString()
    $month = $month2.Replace(" ", "")

    $day1 = $a[2..3]
    $day2 = "$day1"
    $day2 = $day2.ToString()
    $day = $day2.Replace(" ", "")
}

... 等等。之后将其插入数据库。但是,日志文件相当大(目前 3 周 15MB,预计几个月内会达到数百兆),并且脚本已经需要大约 4-5 分钟来处理它。 所以我需要的是从行的开头拆分四个空格分隔的列,将第一和第二转换为日期和时间并将它们与行的消息部分一起添加到数据库的方法。单独处理每个文本块似乎太耗时,例如excel可以在几秒钟内处理这个文件。是否有一些位置感知 csv-import 命令?

谢谢。

发现这个: Replace first two whitespace occurrences with a comma using sed 会有所帮助,如果我会使用 linux... :(

【问题讨论】:

  • 发布原始文件示例和您想要实现的示例
  • 哪些部分是什么? 0226 是日期吗? 111641 时间? (1911) 0 是什么?

标签: powershell


【解决方案1】:

我不确定ConvertFrom-CsvImport-Csv cmdlet 是否可以帮助您,因为您的字段分隔符可能会出现在消息字段中。在不知道这些不同领域是什么的情况下,我想出了这个:

$file = Get-Content "test.txt"

foreach ($line in $file)
{
    # Split $line into at most 5 fields
    $fields = $line -split ' ', 5;
    # fields[0] is a two-digit month followed by a two-digit day
    $date = [DateTime]::ParseExact($fields[0], 'MMdd', $null);
    $field2 = $fields[1];
    $field3 = $fields[2];
    $field4 = $fields[3];
    $message = $fields[4];

    # Process variables here...
}

使用您为$line 提供的示例文本,执行后上述变量如下所示:

PS> Get-Variable -Name @('date', 'field*', 'line', 'message')

Name                           Value
----                           -----
date                           2/26/2012 12:00:00 AM
field2                         111641
field3                         (1911)
field4                         0
fields                         {0226, 111641, (1911), 0...}
line                           0226 111641 (1911) 0 some space separated message
message                        some space separated message

需要更多关于数据格式的信息,以便为您提供更具体的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2022-01-23
    • 2012-04-13
    • 1970-01-01
    • 2019-06-30
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多