Excel 如何从约1500个格式相同的txt文件中提取一行,并将值保存到csv或xls?

Excel 如何从约1500个格式相同的txt文件中提取一行,并将值保存到csv或xls?,excel,data-structures,spreadsheet,data-extraction,Excel,Data Structures,Spreadsheet,Data Extraction,我试图从大约1500个格式相同的txt文件中提取一行文本,然后将这些行中的所有值连同相应的日期(txt文件名)保存到csv文件中 所述txt文件中的行被格式化(上下各有一行数据): 我希望最终生成一个如下所示的xls文件: Date AVG1 AVG2 AVG3 AVG4 AVG5 12-13-06 14.64 9.49 9.46 0.16 243.71 我曾考虑过使用grep或awk,但坦率地说,我不知道从哪里开始。命令行批处理过程是最佳攻击线吗?理想的最终结果

我试图从大约1500个格式相同的txt文件中提取一行文本,然后将这些行中的所有值连同相应的日期(txt文件名)保存到csv文件中

所述txt文件中的行被格式化(上下各有一行数据):

我希望最终生成一个如下所示的xls文件:

Date      AVG1   AVG2  AVG3  AVG4  AVG5
12-13-06  14.64  9.49  9.46  0.16  243.71
我曾考虑过使用grep或awk,但坦率地说,我不知道从哪里开始。命令行批处理过程是最佳攻击线吗?理想的最终结果是将所有这些每日平均值及其相应日期导入excel电子表格。excel中的导入txt选项可以逐个文件工作,但这里的问题是,除非我有一大群人,否则手动将1500个单独文件从txt导入xls文件所需的时间是不可行的

任何见解或指导都将不胜感激。

假设:

  • 所有文本文件都位于同一文件夹中
  • 文本文件以制表符分隔
使用以下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
如何使用宏:

  • 复制要运行宏的工作簿
    • 始终在工作簿副本上运行新代码,以防代码运行不顺畅
    • 这对于任何删除任何内容的代码来说尤其如此
  • 在复制的工作簿中,按ALT+F11打开Visual Basic编辑器
  • 插入|模块复制提供的代码并粘贴到模块中
  • 关闭Visual Basic编辑器
  • 在Excel中,按ALT+F8以显示要运行的可用宏的列表
  • 双击所需的宏(我将此宏命名为tgr)

  • 您可以使用这个bashshell脚本

    #!/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中。

    日期从何而来?文件名,文件“上次修改”戳记?日期来自文件名。例如:“12-13-06.txt”我不会将此作为答案发布,因为您的问题可以通过多种方式解决。选项有:shell脚本+awk(如果您是awk的老板:)或(通过shell脚本循环)在[id | date | avg1 | | | avg5]数据库中加载文件,然后使用任何您觉得合适的编程语言根据需要对其进行格式化。可能还有其他选择。。。
    #!/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