我有一个csv文件,其中包含一组记录。其中一列是多行字符串。我需要拆分这些行并复制主列表。例如,如果文件包含以下记录。
Row 1 - John, 2501, Admin/Partner/HR, TX
Row 2 - Max, 3489, Accountant/Admin/HR, MN
其中Admin/Partner/HR
和Accountant/Admin/HR
是多行字符串。
我需要输出如下:
Row 1 - John, 2501, Admin, TX
Row 2 - John, 2501, Partner, TX
Row 3 - John, 2501, HR, TX
Row 4 - Max, 3489, Accountant, MN
Row 5 - Max, 3489, Admin, MN
Row 6 - Max, 3489, HR, MN
我尝试了以下功能
def splitrows(list_old,col):
count = 0;
array_new = []
for row in list_old:
splitArray = []
splitarray = row[col].split('\n\n')
if(len(splitarray)>0):
for eachLine in splitarray:
row[col] = eachLine
array_new.append(row)
return array_new
如果我使用追加,只会重复最后一行。如果我使用array_new + = row,那么每个列都会被拆分并添加到列表中,但我不希望这种情况发生。
提前致谢!
答案 0 :(得分:2)
因为您解析的内容(几乎)是csv。您可以使用csv module
:
import csv
with open("test.csv") as f:
# create a reader
reader = csv.reader(f)
for row in reader:
# create a new row for each item in column 2
for item in row[2].split('/'):
# align items
row[2] = ' ' + item.lstrip()
print ','.join(row)
输出:
John, 2501, Admin, TX
John, 2501, Partner, TX
John, 2501, HR, TX
Max, 3489, Accountant, MN
Max, 3489, Admin, MN
Max, 3489, HR, MN
答案 1 :(得分:0)
@Reut Sharabani的回答是更好的,因为使用csv库比尝试滚动自己更清晰。话虽如此,我还想解释为什么你会看到你所看到的。
首先,你有一个让我担心你遇到案件问题的虚假行...... splitArray = []
创建一个名为splitArray
的空数组;你的下一行创建了一个名为splitarray
的新数组,在python中,这是一个完全不同的变量。
更重要的是,当你执行row[col] = eachLine
时,它会更改行值,然后当你追加它时,它实际上只附加对row
的引用而不是副本,这样当你改变{{ 1}},您为附加到row
的每个版本更改它。解决这个问题的最简单方法(这也是Reut的答案正在做的)是:
array_new
答案 2 :(得分:0)
ALGO:
csv
模块读取和写入csv文件。/
,即多个值,则执行step 5,6,7
,如果不是则执行step 8
。split()
方法拆分字符串。for
循环迭代每个分割值。输入: input.csv
John, 2501, Admin/Partner/HR, TX
Max, 3489, Accountant/Admin/HR, MN
<强>代码:强>
import csv
input_file = "input.csv"
output_file = "output.csv"
#- Open File and read by csv module.
with open(input_file, ) as fp:
root = csv.reader(fp)
#- Open File in write mode and write by csv module.
with open(output_file, 'wb') as fp2:
writer_root = csv.writer(fp2, delimiter=',')
#- Iterate every row form the Input file.
for row in root:
#- check if second item from row contains / i.e. multiple values.
if "/" in row[2]:
#- Split by /
tmp = row[2].split("/")
for i in tmp:
new_row = [row[0], row[1], i, row[3]]
print "Debug 1: ", new_row
#- Write Row in New file.
writer_root.writerow(new_row)
else:
writer_root.writerow(row)
<强>输出:强>
调试声明:
$ python 5.py
Debug 1: ['John', ' 2501', ' Admin', ' TX']
Debug 1: ['John', ' 2501', 'Partner', ' TX']
Debug 1: ['John', ' 2501', 'HR', ' TX']
Debug 1: ['Max', ' 3489', ' Accountant', ' MN']
Debug 1: ['Max', ' 3489', 'Admin', ' MN']
Debug 1: ['Max', ' 3489', 'HR', ' MN']
输出文件: output.csv
John, 2501, Admin, TX
John, 2501,Partner, TX
John, 2501,HR, TX
Max, 3489, Accountant, MN
Max, 3489,Admin, MN
Max, 3489,HR, MN