разделение другой строки (powershell или другие скриптовые инструменты под windows) - PullRequest
0 голосов
/ 20 марта 2012

У меня есть файл журнала в руке, выглядит так: 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(" ", "")
}

... и так далее.после этого вставив его в базу данных.Тем не менее, файл журнала довольно большой (в настоящее время 15 МБ за 3 недели, ожидается, что он будет занимать сотни мегабайт в течение нескольких месяцев), и сценарию уже требуется около 4-5 минут для его обработки.Так что мне нужен метод для разделения четырех столбцов, разделенных пробелом, от начала строки, преобразования первого и второго в дату и время и добавления их с частью сообщения строки в базу данных.Отдельная обработка каждого блока текста занимает слишком много времени, например, Excel может обработать этот файл за считанные секунды.Есть ли какая-то позиция, осведомленная о команде csv-import?

Спасибо.

Нашел это: Заменить первые два вхождения в пробел запятыми с помощью sed , если бы я использовал linux ...: (

)

1 Ответ

0 голосов
/ 20 марта 2012

Я не уверен, могут ли вам помочь командлеты ConvertFrom-Csv или Import-Csv, поскольку в поле сообщения может отображаться разделитель полей.Не зная, что это за разные поля, я придумал следующее:

$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

Для получения более конкретного ответа потребуется дополнительная информация о формате ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...