根据 .dat 文件中的相似文本将行类别分组到列表中

Posted

技术标签:

【中文标题】根据 .dat 文件中的相似文本将行类别分组到列表中【英文标题】:Group line categories based on similar text from .dat file into a list 【发布时间】:2022-01-23 00:25:04 【问题描述】:

我对使用 CSV 完全陌生。我已经逐行看到了答案,但我发现没有阅读成组的行。我有一个 csv 文件,其中包含例如以下数据格式,其中第一行包含开始、月份和日期。从第二行开始,我只有最后两列的数据,比如 A 和 B。

starting    6   3
    34.75   15
    34.75   15.25
    32.5    14.2
starting    7   27
    12.75   14.75
    13  15  
starting    7   28
    29  33
    29  33.25

我想要做的是从每个 starting 下方检索数据,并将它们分别写为 3 个数组的列表,每个数组有 2 列。这样做的目的是能够独立地绘制 starting 的每个数组。

这是我经过多次搜索后设法编写的代码,请帮助纠正我遗漏的地方。

import numpy as np

#input file
f=open('./latlon.dat','r') 

lines = f.readlines()    # Read file and close
f.close()

i = 0
tr = []

while (i < (len(lines)-1) ):
    line = lines[i]
    i = i+1
    linesplit = line.strip().split('\t')
    if linesplit[0] == 'start' :
        latlog = int(linesplit[1])
        latlogarray = np.genfromtxt(lines[i:(i+latlog)])
        for k in range (i-1,i+latlog):
            i = i+latlogarray
            tr.append(k)
print(tr)

谢谢你的期待。

【问题讨论】:

【参考方案1】:

您可以使用 Python 的 CSV 模块完成此操作。

阅读您的问题,您有一个,由starting 分隔。该组的数据在该行之后开始。最后,您需要所有组。

如果是这样,那么您想逐行阅读,当您阅读第一列中带有starting 的行时,保存最后一个组(如果存在)并开始一个新组:

#!/usr/bin/env python3
import csv
import pprint

groups = []
group = None
with open('latlon.dat', newline='') as f:
    reader = csv.reader(f, delimiter='\t')

    for row in reader:
        # Normalize all cells at once
        row = [cell.strip() for cell in row]

        # Deal with "blank" lines
        if len(row) == 0 or len(row) == 1:
            continue

        # Starting new group...
        if row[0] == 'starting':
            # Save last group, if it exists
            if group:
                groups.append(group)
            # Reset group
            group = []
            # Don't do anything else with this row
            continue

        # A "data row"
        group.append([float(row[1]), float(row[2])])


groups.append(group)
pprint.pprint(groups)

当我对你的样本运行它时,我得到:

[
 [[34.75, 15.0], [34.75, 15.25], [32.5, 14.2]],
 [[12.75, 14.75], [13.0, 15.0]],
 [[29.0, 33.0], [29.0, 33.25]]
]

【讨论】:

嗯,有几件事。我刚刚更新了您的示例,在它周围添加了一个代码围栏......当我复制粘贴该代码围栏中的所有内容作为 latlon.dat 使用时,它会运行并为我提供该输出。所以,请做同样的事情——按原样使用帖子中的示例,并将其作为输入来测试我的代码。 另外,您的实际数据中有多少组?我想它比你的样本中的三个多。 您的回答正是我所期望的。在某些情况下,我有大约 8 个组,在其他情况下甚至更多。我本可以在这里共享文件,但我不知道该怎么做。我是 *** 的新手。你能指导我,然后我可以分享文件吗? 那么,当您针对帖子中的示例运行我的代码时,它可以工作吗?如果是这样,那么您的真实数据中的某些内容未在您的示例中显示。您需要找到真实数据中的问题所在。要么手动修复它,要么调整代码处理这种新情况。无论哪种方式,听起来我的代码都适用于您发布的示例。请接受和/或支持我的贡献。 当然!今天是我第一次尝试 ***。干杯!【参考方案2】:

在这种情况下使用 pandas 可能会更容易:

import pandas as pd

df = pd.read_csv('./latlon.dat', sep = ' ') # sep is whatever delimiter you want
df.plot() # will plot the three variables together

【讨论】:

以上是关于根据 .dat 文件中的相似文本将行类别分组到列表中的主要内容,如果未能解决你的问题,请参考以下文章

jQuery根据下拉列表中的选择将行移动到另一个表

如何根据某些文本标准对元组列表进行分组/存储?

如何对相似的类别进行分组?

Crystal Report,根据Criteria将行分组为单行

根据与 LDA 主题/特征集群的相似性对文本进行分组

Flutter如何根据某个值从firebase对列表进行分组