Как извлечь одну строку из каждого из ~ 1500 одинаково отформатированных файлов txt и сохранить значения в csv или xls?

Я пытаюсь извлечь одну строку текста из каждого из ~ 1500 одинаково отформатированных текстовых файлов, а затем сохранить все значения в этих строках вместе с соответствующей датой (имя текстового файла) в файл csv.

Строки в указанных текстовых файлах форматируются таким образом (есть ряды данных сверху и снизу):

DAILY AVG:       14.64          9.49          9.46          0.16       243.71

Я надеюсь в конечном итоге создать файл xls, который выглядит так:

Date      AVG1   AVG2  AVG3  AVG4  AVG5
12-13-06  14.64  9.49  9.46  0.16  243.71

Я думал об использовании grep или awk, но, честно говоря, понятия не имею, с чего начать. Является ли пакетная процедура командной строки лучшей линией атаки? Желаемый конечный результат состоит в том, чтобы все эти средние дневные значения вместе с соответствующими датами были импортированы в электронную таблицу Excel. Опция импорта txt в Excel будет работать на основе файла за файлом, но проблема здесь в том, что время, необходимое для ручного импорта 1500 отдельных файлов из txt в файлы xls, было бы невозможно, если бы у меня не было армии людей.

Любое понимание или направление будет принята с благодарностью.


person ptrckqnln    schedule 13.08.2013    source источник
comment
Откуда дата? Имя файла, штамп файла «последнее изменение»?   -  person JScoobyCed    schedule 13.08.2013
comment
Дата исходит из имени файла. Например: "12-13-06.txt"   -  person ptrckqnln    schedule 13.08.2013
comment
Я бы не стал публиковать это как ответ, потому что ваш вопрос можно решить разными способами. Варианты: сценарий оболочки + awk, если вы босс в awk :) Или загрузка (через цикл сценария оболочки) файлы в базе данных [id|date|avg1|...|avg5], а затем любой язык программирования, который вам удобен. с форматированием по мере необходимости. Возможно другие варианты...   -  person JScoobyCed    schedule 13.08.2013


Ответы (2)


Предположения:

  • Все текстовые файлы находятся в одной папке
  • Текстовые файлы разделены табуляцией

Используйте этот код Excel VBA:

Sub tgr()

    Dim oShell As Object
    Dim oFSO As Object
    Dim arrData(1 To 65000) As String
    Dim strFolderPath As String
    Dim strFileName As String
    Dim strText As String
    Dim DataIndex As Long
    Dim lAvgLoc As Long

    Set oShell = CreateObject("Shell.Application")
    On Error Resume Next
    strFolderPath = oShell.BrowseForFolder(0, "Select a Folder", 0).Self.Path & Application.PathSeparator
    Set oShell = Nothing
    On Error GoTo 0
    If Len(strFolderPath) = 0 Then Exit Sub 'Pressed cancel

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    strFileName = Dir(strFolderPath & "*.txt*")
    Do While Len(strFileName) > 0
        strText = oFSO.OpenTextFile(strFolderPath & strFileName).ReadAll
        lAvgLoc = InStr(1, strText, "Daily Avg", vbTextCompare)
        If lAvgLoc > 0 Then
            strText = Mid(strText, lAvgLoc)
            strText = Trim(Mid(Replace(strText, vbCrLf, String(255, " ")), Evaluate("MIN(FIND({1,2,3,4,5,6,7,8,9,0},""" & strText & """&1234567890))"), 240))
            DataIndex = DataIndex + 1
            arrData(DataIndex) = DateValue(Replace(strFileName, ".txt", vbNullString)) & vbTab & strText
        End If
        strFileName = Dir
    Loop

    If DataIndex > 0 Then
        With Sheets.Add
            .Range("A1:F1").Value = Array("DATE", "AVG1", "AVG2", "AVG3", "AVG4", "AVG5")
            With .Range("A2").Resize(DataIndex)
                .Value = Application.Transpose(arrData)
                .TextToColumns .Cells, xlDelimited, xlTextQualifierDoubleQuote, Tab:=True
                .NumberFormat = "mm-dd-yy"
            End With
            Application.DisplayAlerts = False
            .SaveAs strFolderPath & "Daily Averages.csv", xlCSV
            Application.DisplayAlerts = True
        End With
    End If

    Set oFSO = Nothing
    Erase arrData

End Sub

Как использовать макрос:

  1. Make a copy of the workbook the macro will be run on
    • Always run new code on a workbook copy, just in case the code doesn't run smoothly
    • Это особенно верно для любого кода, который удаляет что-либо.
  2. В скопированной книге нажмите клавиши ALT+F11, чтобы открыть редактор Visual Basic.
  3. Вставить | Модуль Скопируйте предоставленный код и вставьте в модуль
  4. Закройте редактор Visual Basic
  5. В Excel нажмите ALT+F8, чтобы открыть список доступных макросов для запуска.
  6. Дважды щелкните нужный макрос (я назвал его tgr)
person tigeravatar    schedule 13.08.2013

Вы можете использовать этот сценарий оболочки bash.

#!/bin/sh

echo Date AVG1 AVG2 AVG3 AVG4 AVG5 > output.txt
for i in *.txt
do  
    STRING=${i%.txt}
    DATA=`cat $i | tr -s ' ' | cut -d ' ' -f 3-`
    echo $STRING $DATA >> output.txt
done

Предполагая, что все файлы данных находятся в текущем каталоге, это поместит желаемый результат в output.txt. Затем вы можете загрузить это в Excel.

person Subhasis Das    schedule 15.08.2013