繁体   English   中英

如何使用 python 脚本将一行中存在的数据(以空格分隔)拆分为同一 excel 工作表中的不同列?

[英]How to split data present in a row (separated by space) into different column in the same excel sheet using python script?

我有一个包含 CAN 数据的文件,格式为:

(000.000000)  can0  1FF   [7]  20 08 87 0E 1D 98 0E

该数据存在于单个单元格中。 如何使用 python 脚本将此数据拆分为单独的列(例如:一列中的000.000000 ,一列中的can0 ,单独列中的1FF等)。

您需要将数据行拆分为一定数量的空格字符。 您在原始帖子中共享的输入由空格分隔(我看不到制表符或其他空白字符)。

我们可以通过用项目符号替换它们来可视化数据中的空间:

with open("input.txt") as f_in:
    for line in f_in:
        line = line.strip()
        print(line.replace(" ", "•"))

现在我们可以清楚地看到数据单元格之间有多少空格(为了清楚起见,我还模拟了另一行):

(000.000000)••can0••1FF•••[7]••20•08•87•0E•1D•98•0E
(000.000000)••can1••2DF•••[7]••90•0A•DE•3E•AA•B8•99

如果您想要在自己的单元格/列中的每一位数据; 您可以使用此正则表达式r" {1,}"来拆分一个或多个(任意数量)空格字符:

re.split(r" {1,}", "foo  bar   baz baker")  # ["foo", "bar", "baz", "baker"]

打开您的输入文件,并遍历行,拆分每一行并将结果行存储在行列表中:

rows = []
with open("input.txt") as f_in:
    for line in f_in:
        line = line.strip()  # get rid of trailing line break character(s)
        row = re.split(r" {1,}", line)
        rows.append(row)

和行看起来像这样:

[
 ['(000.000000)', 'can0', '1FF', '[7]', '20', '08', '87', '0E', '1D', '98', '0E'],
 ['(000.000000)', 'can1', '2DF', '[7]', '90', '0A', 'DE', '3E', 'AA', 'B8', '99']
]

如果您希望最后一组十六进制值保留为一个数据单元格,则将正则表达式更改为r" {2,}"以拆分两个或多个空格字符。 这将保留单个十六进制值之间的单个空格,将所有十六进制值留在一列中:

rows = []
with open("input.txt") as f_in:
    for line in f_in:
        line = line.strip()
        row = re.split(r" {2,}", line)
        rows.append(row)

和行看起来像这样:

[
 ['(000.000000)', 'can0', '1FF', '[7]', '20 08 87 0E 1D 98 0E'],
 ['(000.000000)', 'can1', '2DF', '[7]', '90 0A DE 3E AA B8 99']
]

但是,您需要拆分行,您现在有一组行,您可以写回 CSV:

import csv

with open("output.csv", "w", newline="") as f_out:
    writer = csv.writer(f_out)
    writer.writerow(["Col1", "Col2", "Col3", "Col4", "Col5"])  # write a single row (a list of strings)
    writer.writerows(rows)                                     # write multiple rows (list of list of strings)

你会得到一个看起来像这样的 CSV:

Col1 Col2 Col3 Col4 Col5
(000.000000) 罐头0 1FF [7] 20 08 87 0E 1D 98 0E
(000.000000) 罐头1 二维 [7] 90 0A DE 3E AA B8 99

您可以按空间拆分数据并使用 pandas 获取列。

import pandas as pd

text = '(000.000000)  can0  1FF   [7]  20 08 87 0E 1D 98 0E'
data = text.split(' ')
res = {k: [''] for k in data if k}
df = pd.DataFrame(res)
print(df)
>>>>   (000.000000) can0 1FF [7] 20 08 87 0E 1D 98
     0 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM