使用python将逗号分隔字符串转换为excel单元格

使用python将逗号分隔字符串转换为excel单元格,python,excel,openpyxl,xlsxwriter,xlwt,Python,Excel,Openpyxl,Xlsxwriter,Xlwt,我想将内容从字符串推送到xls 内容是 abc,[1,2],abc/er/t_y,def,[3,4],def/er/t_d,ghi,ghi/tr/t_p,jkl,[5],jkl/tr/t_m_n,nop,nop/tr/t_k 这是我的示例代码(使用xlwt) 在excel中摄取数据时,很少有规则可遵循 - column headers are main,ids,UI - each cell have one value except ids [ids may or may not be the

我想将内容从字符串推送到xls 内容是

abc,[1,2],abc/er/t_y,def,[3,4],def/er/t_d,ghi,ghi/tr/t_p,jkl,[5],jkl/tr/t_m_n,nop,nop/tr/t_k
这是我的示例代码(使用xlwt)

在excel中摄取数据时,很少有规则可遵循

- column headers are main,ids,UI
- each cell have one value except ids [ids may or may not be there]
- after three columns it should move to the next row
- the second column i.e **id** should have only ids and if not available it should be kept as blank
如何使用上述规则将数据推送到与此类似的excel中

 | A  | B | C |
1|main|ids|UI|
2|abc |1,2|abc/tr/t_y|
3|def |3,4|def/tr/t_d|
4|ghi |   |ghi/tr/t_p|
5|jkl |5  |jkl/tr/t_m_n|
6|nop |   |nop/tr/t_k|

使用正则表达式以[]检查值

import re
m = re.search(r"\[(\w+)\]", column)


使用正则表达式以[]检查值

import re
m = re.search(r"\[(\w+)\]", column)


如果您的问题是如何将输入字符串分解为可以用代码处理的内容:

import re

content = 'abc,[1,2],abc/er/ty,def,[3,4],def/er/td,ghi,ghi/tr/tp,jkl,[5],jkl/tr/tm,nop,nop/tr/tk'

finalvalue = []
for match in re.finditer(r"(\w+),(\[\d+(?:,\d+)*\],)?([\w/]+)", content):
    finalvalue.append((
        match.group(1),
        None if match.group(2) is None else match.group(2)[1:-2],
        match.group(3)
    ))

print(finalvalue)
结果:

[('abc', '1,2', 'abc/er/ty'), ('def', '3,4', 'def/er/td'), ('ghi', None, 'ghi/tr/tp'), ('jkl', '5', 'jkl/tr/tm'), ('nop', None, 'nop/tr/tk')]

注意:行不再存储为字符串,而是存储为元组,因此您可以稍微简化代码。

如果您的问题是如何将输入字符串分解为可以用代码处理的内容:

import re

content = 'abc,[1,2],abc/er/ty,def,[3,4],def/er/td,ghi,ghi/tr/tp,jkl,[5],jkl/tr/tm,nop,nop/tr/tk'

finalvalue = []
for match in re.finditer(r"(\w+),(\[\d+(?:,\d+)*\],)?([\w/]+)", content):
    finalvalue.append((
        match.group(1),
        None if match.group(2) is None else match.group(2)[1:-2],
        match.group(3)
    ))

print(finalvalue)
结果:

[('abc', '1,2', 'abc/er/ty'), ('def', '3,4', 'def/er/td'), ('ghi', None, 'ghi/tr/tp'), ('jkl', '5', 'jkl/tr/tm'), ('nop', None, 'nop/tr/tk')]

注意:行不再存储为字符串,而是存储为元组,因此您可以简单地编写代码。

这里没有问题?@Grismar更新了描述以澄清实际问题您的规则有一个矛盾:一方面“每个单元格应该有一个值”,但另一方面,如果没有可用的id,“单元格应该为空”?另外:示例数据中没有不包含
main
UI
数据的行-是否总是保证输入中有数据,并且
id
是唯一有时为空的值?您的问题是如何拆分字符串以使您提供的代码正常工作?@Grismar Yes。。main和UI总是有价值的,而ids则没有保证。我想将字符串拆分为三个单独的单元格,如figureOk@amrey所示,那么我认为我在答案中发布的代码实际上解决了您的问题。这里没有问题吗?@Grismar更新了描述以澄清实际问题您的规则有一个矛盾:一方面“每个单元格应该有一个值”,但另一方面,如果没有可用的id,“单元格应为空”?另外:示例数据中没有不包含
main
UI
数据的行-是否总是保证输入中有数据,并且
id
是唯一有时为空的值?您的问题是如何拆分字符串以使您提供的代码正常工作?@Grismar Yes。。main和UI总是有价值的,而ids则没有保证。我想将字符串拆分为三个单独的单元格,如figureOk@amrey所示,然后我认为我在答案中发布的代码实际上解决了您的问题。@不知何故,这段代码让我得到了所有没有ID的集合,但分组错误。下面是代码
flvalue=[]def convstrtup():print(“我正在将str转换为tuple”)用于在re.finditer中匹配(r“(\w+),(\[\d+(?:,\d+*\),)?([\w/]+)”,finalvalue:flvalue.append((match.group(1),如果match.group(2)不是其他匹配,则无)。group(2)[1:-2],match.group(3)))print(“Str to tuple>>:”,flvalue)convstrtup()
op我像
[('tp','ghi'),('tk','nop')]
很抱歉,我不会调试注释中出现错误的代码。一旦我删除了您注释中代码中的错误,它就可以正常工作,并且您发布的代码没有得到您注释中包含的输出。如果您觉得解决方案对某些输入不起作用,请将其添加到您的问题中,不要在注释中发布代码。@看到这一点,这并没有产生输出。如您所说,在问题中添加了额外的输入…很抱歉在注释中添加了代码。我不知道这些标准。[我使用了这个regex intstead(\w+),[([^][+]),([\w/]+]这里的问题很简单,括号中没有数字,但括号中有字符串,即不是
[1,2]
,而是
['1','2']
,这不是你在问题中指定的。同样,在同一个列表中也有空格,但也没有指定。你最终会得到类似
(\w+),(\['?\d+')的结果?(?:,\s*'?\d+'?)*\],)([\w/]+)
@不知怎么的,这段代码让我得到了所有没有错误分组ID的集合。以下是代码
flvalue=[]def convstrtup():打印(“我在将str转换为tuple”)以匹配re.finditer(r)(\w+),(\[\d+(?:,\d+*\),)([\w/])+)+,([\d+)*\),),([\w/]),finalvalue):flvalue.append((match.group(1),如果match.group(2)不是其他匹配项,则为None。group(2)[1:-2],match.group(3)))打印(“Str到tuple>:”,flvalue)convstrtup()
op我像
[('tp','ghi'),('tk','nop')]
很抱歉,我不会调试注释中出现错误的代码。一旦我删除了您注释中代码中的错误,它就可以正常工作,并且您发布的代码没有得到您注释中包含的输出。如果您觉得解决方案对某些输入不起作用,请将其添加到您的问题中,不要在注释中发布代码。@看到这一点,这并没有产生输出。如您所说,在问题中添加了额外的输入…很抱歉在注释中添加了代码。我不知道这些标准。[我使用了这个regex intstead(\w+),[([^][+]),([\w/]+]这里的问题很简单,括号中没有数字,但括号中有字符串,即不是
[1,2]
,而是
['1','2']
,这不是你在问题中指定的。同样,在同一个列表中也有空格,但也没有指定。你最终会得到类似
(\w+),(\['?\d+')的结果?(?:,\s*'?\d+'?)*\],)([\w/]+)