我手头有一个日志文件,如下所示: 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 ... :(
答案 0 :(得分:0)
我不确定ConvertFrom-Csv
或Import-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
您需要了解有关数据格式的更多信息,以便为您提供更具体的答案。