0

我正在尝试从 ~1500 个格式相同的 txt 文件中的每一个中提取一行文本,然后将这些行中的所有值连同相应的日期(txt 文件名)一起保存到 csv 文件中。

所述txt文件中的行因此被格式化(上面和下面有数据行):

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 电子表格中。excel 中的导入 txt 选项将在逐个文件的基础上工作,但这里的问题是手动将 1500 个单个文件从 txt 导入 xls 文件所需的时间是不可行的,除非我有一大群人。

任何见解或方向将不胜感激。

4

2 回答 2

0

假设:

  • 所有文本文件都位于同一文件夹中
  • 文本文件是制表符分隔的

使用此 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. 制作宏将在其上运行的工作簿的副本
    • 始终在工作簿副本上运行新代码,以防代码运行不顺畅
    • 对于删除任何内容的任何代码来说尤其如此
  2. 在复制的工作簿中,按 ALT+F11 打开 Visual Basic 编辑器
  3. 插入 | 模块复制提供的代码并粘贴到模块中
  4. 关闭 Visual Basic 编辑器
  5. 在 Excel 中,按 ALT+F8 以调出要运行的可用宏列表
  6. 双击所需的宏(我将这个命名为 tgr)
于 2013-08-13T03:46:44.897 回答
0

您可以使用这个 bash shell 脚本。

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

于 2013-08-15T06:52:39.820 回答