【问题标题】:Need to take data from text file to spreadsheet for analysis需要将文本文件中的数据提取到电子表格中进行分析
【发布时间】:2014-03-25 04:42:26
【问题描述】:

我正在处理从文本文件中获得的数据,这些数据必须随后进行分析。我目前正在使用 Excel 来完成这项任务。原始文件如下所示:

Contact Angle (deg)     86.20
Wetting Tension (dy/cm)     4.836
Wetting Tension Left (dy/cm)    39.44
Wetting Tension Right (dy/cm)   39.44
Base Tilt Angle (deg)       0.00
Base (mm)           1.6858
Base Area (mm2)         2.2322
Height (mm)         0.7888
Tip Width (mm)          0.9707
Wetted Tip Width (mm)       0.9581
Sessile Volume (ul)     1.1374
Sessile Surface Area (mm2)  4.1869
Contrast (cts)          245
Sharpness (cts)         161
Black Peak (cts)        10
White Peak (cts)        255
Edge Threshold (cts)        111
Base Left X (mm)        4.138
Base Right X (mm)       5.821
Base Y (mm)         2.980
RMS Fit Error (mm)      3.545E-3
@1600

我不需要这些信息的大部分,现在,我只需要顶部的接触角和时间(以底部的“@”为前缀)。目前,我有一个脚本可以提取我需要的信息并创建另一个文本文件以便于阅读。使用的代码如下:

infile = "in.txt"
outfile = "newout.out"
measure_time = ""
with open(infile) as f, open(outfile, 'w') as f2:
    for line in f:
        if line.split():
            if line.split()[0] == "Contact":
                contact_angle = line.split()[-1].strip()
                f2.write("Contact Angle (deg): " + contact_angle + '\n')
            if line.split()[0][0] == '@':
                for i in range(1,5):
                    measure_time += (line.split()[0][i])
                f2.write("Measured at: " + measure_time[:2] + ":" + measure_time[2:] + '\n')
            measure_time = ""
        else:
            continue

我正在寻找一种方法,可以在电子表格中很好地格式化我的数据,以便于分析。我想要同一行中相邻单元格中的角度,以及下方单元格中的测量时间,但我不确定最好的方法是什么。

有更多 Python 经验的人可以在这里帮助我吗?

编辑:这里的图片显示了我在上面试图解释的内容。

EDIT2:@RonRosenfeld 在下面发布的解决方案有效,但我仍然希望有一个 Python 解决方案来解决这个问题,如前所述。由于我以前没有使用 Excel VBA 的经验,我宁愿使用我熟悉的东西。

【问题讨论】:

  • 您能否使用您提供的数据添加您想要的 Excel 输出的快速草图或图像?然后我们可以向您展示一些代码来完成这些结果。
  • 查看一种 .NET 语言或 VB 脚本(您不需要为此安装任何东西),使用带有这些语言的 .net 库可以实现与 Microsoft Office 的紧密集成,并且几乎所有内容都是内置。
  • @JohnDorian 我在原始帖子中添加了一张图片。沿着这些思路的东西是我想要的。原始文本文件通常很长,所以我想读取第一块文本的角度和测量时间,然后移动到下一个块的新列,等等......这有帮助吗?
  • @Matthew 我在下面编辑了我的答案,以说明您在图像中显示的布局。我还将您的时间值转换为“真实”Excel 时间,并按照您上面显示的格式进行格式化。

标签: python excel csv python-3.x


【解决方案1】:

我只是将一个或多个原始文件读入 Excel,只选择那些以 Contact Angle 或 @ 标记开头的行。我不确定你需要做多少错误检查。以下假设您将选择多个文件,并且每个文件的格式都与您在原始数据中演示的一样。它将在第 1 行输出角度,在第 2 行输出相应的时间。它不检查格式是否正确;或者说每个角度都有对应的时间。

如果您只选择一个文件,它也不会测试并且会出错。如有必要,可以添加该功能。

编辑: 修改为将 TABSPACE 作为分隔符;还添加了代码以清除工作表并自动调整列

如果要选择附加参数,也应该很容易修改。

    Option Explicit
'Set Reference to Microsoft Scripting Runtime
Sub GetDataFromTextFiles()
    Dim FSO As FileSystemObject
    Dim TS As TextStream
    Dim F As File
    Dim sLines As Variant
    Dim I As Long, J As Long
    Dim sFilePath
    Dim S As String
    Dim vLines() As Variant
    Dim rExtract As Range
'Hard Coded here but could also use a
'User form to select multiple lines
vLines = Array("@", "Contact Angle")
Set rExtract = [b3]
Cells.Clear

[a3] = "Contact Angle (deg)"
[a4] = "Measured At"

sFilePath = Application.GetOpenFilename("Text Files (*.txt), *.txt", MultiSelect:=True)
Set FSO = New FileSystemObject

For J = LBound(sFilePath) To UBound(sFilePath)
    Set TS = FSO.OpenTextFile(sFilePath(J), ForReading)

    Do Until TS.AtEndOfStream = True
    S = Trim(Replace(TS.ReadLine, Chr(9), Chr(32)))
        For I = 0 To UBound(vLines)
            If InStr(1, S, vLines(I)) = 1 Then
                Select Case I
                    Case 0 '@
                        With rExtract(2, 1)
                            .Value = TimeSerial(Int(Mid(S, 2) / 100), Mid(S, 2) Mod 100, 0)
                            .NumberFormat = "hh:mm"
                        End With
                    Case 1  '@
                        rExtract(1, 1) = Mid(S, InStrRev(S, " ") + 1)
                        'advance to next column after outputting angle
                        Set rExtract = rExtract(1, 2)
                End Select
            End If
        Next I
    Loop
Next J

Cells.EntireColumn.AutoFit

End Sub

这是另一个不需要设置对 Microsoft Scripting Runtime 的引用的宏。它不使用 FileSystemObject,而是使用内置的 VBA 例程来读取文件。有人告诉我它会运行得更快,但我自己没有测试过。此外,某些类型的数据可能存在问题,但它们似乎不存在于您的文件中,并且在您的示例上运行良好。

Option Explicit
Sub GetDataFromTextFiles()
    Dim sLines As Variant
    Dim I As Long, J As Long
    Dim sFilePath
    Dim S As String
    Dim vLines() As Variant
    Dim rExtract As Range
'Hard Coded here but could also use a
'User form to select multiple lines
vLines = Array("@", "Contact Angle")
Set rExtract = [b3]
Cells.Clear

[a3] = "Contact Angle (deg)"
[a4] = "Measured At"

sFilePath = Application.GetOpenFilename("Text Files (*.txt), *.txt", MultiSelect:=True)
For J = LBound(sFilePath) To UBound(sFilePath)
    Open sFilePath(J) For Input As #1
    Do While Not EOF(1)
    Input #1, S
    S = Trim(Replace(S, Chr(9), Chr(32)))
        For I = 0 To UBound(vLines)
            If InStr(1, S, vLines(I)) = 1 Then
                Select Case I
                    Case 0 '@
                        With rExtract(2, 1)
                            .Value = TimeSerial(Int(Mid(S, 2) / 100), Mid(S, 2) Mod 100, 0)
                            .NumberFormat = "hh:mm"
                        End With
                    Case 1
                        rExtract(1, 1) = Mid(S, InStrRev(S, " ") + 1)
                        'advance to next column after outputting angle
                        Set rExtract = rExtract(1, 2)
                End Select
            End If
        Next I
    Loop
    Close #1
Next J

Cells.EntireColumn.AutoFit

End Sub

【讨论】:

  • 这似乎是一个超出基本的问题,但我如何实现您提供的代码?
  • 抱歉,我以为您对 Excel 比较熟悉。它是 Excel VBA 代码(应用程序的可视化基础)。打开 Excel 工作簿。然后,要输入此宏 (Sub), 打开 Visual Basic 编辑器。确保您的项目在 Project Explorer 窗口中突出显示。然后,从顶部菜单中,选择插入/模块并将代码粘贴到打开的窗口中。要使用此宏 (Sub), 打开宏对话框。按名称和 选择宏。它将允许您选择多个文本文件;然后循环浏览文本文件以提取数据。
  • 在运行宏之前,从VB编辑器的第一行,选择工具;然后是参考;并从下拉列表中选择 Microsoft Scripting Runtime。
  • 我认为 OP 虽然想要 python
  • @JohnDorian 嗯,我认为他的目标是将文本文件中的数据导入 Excel 以供进一步分析。所以我提供了一个可以在 Excel 中实现的解决方案。如果必须使用 Python,那么我的回答是不合适的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2019-09-10
相关资源
最近更新 更多