Python 将原始文本转换为csv
我有一个原始数据集(纯文本)。三个样本行如下所示:Python 将原始文本转换为csv,python,r,csv,Python,R,Csv,我有一个原始数据集(纯文本)。三个样本行如下所示: S.11*N.英格兰L-8'21-23 u44' S.18坦帕湾W-7 40-7 u49' S.25布法罗L-4'18-33 o48 我想把它转换成csv文件。我怎样才能做到?(我喜欢Python或R) csv文件应类似于: S,11,*,英格兰北部,L,-8',21,23,u44' S、 坦帕湾18号,西-7号,40号,7号,u49' S、 25,布法罗,L,-4',18-33,o48 如果查看链接到的网页的来源,您将看到每行数据都包含在一
S.11*N.英格兰L-8'21-23 u44'
S.18坦帕湾W-7 40-7 u49'
S.25布法罗L-4'18-33 o48
我想把它转换成csv文件。我怎样才能做到?(我喜欢Python或R)
csv文件应类似于:
S,11,*,英格兰北部,L,-8',21,23,u44'
S、 坦帕湾18号,西-7号,40号,7号,u49'
S、 25,布法罗,L,-4',18-33,o48
如果查看链接到的网页的来源,您将看到每行数据都包含在一个
元素中,并且每个字段之间都有一个包含空格的
。因此,源代码如下所示(为了清晰起见,我添加了换行符):
S.11*
英格兰北部
L
-8'
21-23
u44'
这意味着在HTML源代码中,您可以区分分隔字段的空格和城市名称中的空格之间的区别,这解决了导入此数据的最大问题。因此,最好的策略可能是使用Python中的lxml之类的东西来解析来自页面源的数据。在获得每个字段后,需要进行一些后处理,将第一个字段中的“*”之类的内容拆分为指定的单独列。然后,您可以轻松地从Python导出到csv
然而,更大的问题是,这些数据几乎肯定是通过手动输入生成的,这意味着随着时间的推移,您很可能会在数据中遇到微妙的不一致。当您修复越来越多的问题时,您的解析代码将承受特殊情况的负担。因此,你应该考虑你想做的事情是否值得维持这么多乱七八糟的代码。 < P>我使用了前8行数据DOR测试。第9行是再见,我想你应该想用不同的方式来处理这些问题。若并没有,那个么发布问题构造代码,该代码在说明边缘情况时更加全面。这与(字母.句点.2 nums)(空格|星号)(空格)(字母.句点,破折号长度不超过15)的模式相匹配,并在读取前插入逗号
read.table(text=sub(
patt= "^([[:alpha:]]\\.[0-9]{2})([ *])([ ]{1,5})([a-zA-Z .-]{3,15})([ ])",
repl= "\\1,\\2,\\4,",
dat[1:8]) ,
sep=",", stringsAsFactors=FALSE,quote="\"")
V1 V2 V3 V4
1 S.11 * N. ENGLAND L -8' 21-23 u44'
2 S.18 TAMPA BAY W -7 40-7 u49'
3 S.25 Buffalo L -4' 18-33 o48
4 O.02 L. ANGELES L -9' 13-17 u43'
5 O.06 * San Francisco W -3' 33-21 o43'
6 O.17 * N.Y. JETS W -7' 28-3 u46
7 O.23 * SEATTLE-ot L -1' 6-6 u43'
8 O.30 Carolina L +2' 20-30 o46
这将创建dat
项:
dat <- readLines( textConnection("S.11* N. ENGLAND L -8' 21-23 u44'
S.18 TAMPA BAY W -7 40-7 u49'
S.25 Buffalo L -4' 18-33 o48
O.02 L. ANGELES L -9' 13-17 u43'
O.06* San Francisco W -3' 33-21 o43'
O.17* N.Y. JETS W -7' 28-3 u46
O.23* SEATTLE-ot L -1' 6-6 u43'
O.30 Carolina L +2' 20-30 o46
N.06 Bye
N.13 S. FRAN. L -13' 23-20 u47
N.20 Minnesota L +2 24-30 o40
N.27 Atlanta L +4 19-38 o49'
D.04 WASH. W -2' 31-23 o48'
D.11 Miami L -2 23-26 o44
D.18 N. ORLEANS L -3 41-48 o48'
D.24 Seattle W +8 34-31 o43'
J.01 Los Angeles W -7 44-6 o39'"))
您可以使用
csv
模块完成其中的一部分,并在开始时手动处理非常混乱的字段
假设您使用的是Python 3.x,我的意思是:
import csv
input_filename = 'raw_dataset.txt'
output_filename = 'spreads.csv'
with open(input_filename, 'r', newline='') as infile, \
open(output_filename, 'w', newline='') as outfile:
reader = csv.reader(infile, delimiter=' ', skipinitialspace=True)
writer = csv.writer(outfile, delimiter=',')
for row in reader:
new_cols = row[0].split('.')
if not new_cols[1].endswith('*'):
new_cols.extend([''])
else:
new_cols[1] = new_cols[1][:-1]
new_cols.extend(['*'])
row = new_cols + row[1:]
#print(row)
writer.writerow(row)
生成的csv输出文件的内容:
S,11,*,N,英格兰,L,-8',21-23,u44'
S、 坦帕湾18号,西-7,40-7,u49'
S、 水牛城25号,L,-4',18-33,o48
O、 洛杉矶,L,-9',13-17,u43'
O,06,*,San,弗朗西斯科,W,-3’,33-21,O43’
O、 纽约州喷气式飞机17号,西-7',28-3,u46
O、 西雅图ot,L,-1',6-6,u43'
O、 卡罗莱纳州南卡罗来纳州30号+2',20-30,o46
N、 06,再见
N、 法国南部13号,L,-13',23-20,u47
N、 20,明尼苏达州,L,+2,24-30,o40
N、 亚特兰大,L,+4,19-38,o49'
D、 华盛顿,W,-2',31-23,o48'
D、 11,迈阿密,L,-2,23-26,o44
D、 新奥尔良北区18号,L-3,41-48,o48'
D、 西雅图,W,+8,34-31,o43'
J、 01,洛杉矶,西-7,44-6,o39'
什么可能会产生这样一个怪物?嗯,这是来自NFL的原始数据……如果您的其他数据与您的示例一样不一致,我认为除了手动之外,没有任何方法可以将其转换为CSV。每个字段之间是否可能有制表符?那就更可行了。我不认为这些是标签字符,但这里的网站只是为了确保:是的,嗯,复制粘贴可能是一个糟糕的方式…谢谢。我想我会照你说的做,但是我会手动修复特殊情况。谢谢,听起来很有帮助!您可以包含用于将数据输入R的代码吗?您可能可以使用常规的read.table()
读取非字节行。不幸的是,它将洛杉矶(和其他团队)分成两个单元格。但是我想我可以用find和replace来解决这个问题,你可以通过检查行的最后长度来处理它们。在那些没有包含嵌入空格的名称的元素中,将有8个元素,任何包含嵌入空格的元素将有9个(或更多)。然后可以通过将行元素合并到一起,直到达到正确的长度来缩短这些行。谢谢!我没想到。仍然醒来。。。
> read.table(text=dat2$V4)
V1 V2 V3 V4
1 L -8' 21-23 u44'
2 W -7 40-7 u49'
3 L -4' 18-33 o48
4 L -9' 13-17 u43'
5 W -3' 33-21 o43'
6 W -7' 28-3 u46
7 L -1' 6-6 u43'
8 L +2' 20-30 o46
import csv
input_filename = 'raw_dataset.txt'
output_filename = 'spreads.csv'
with open(input_filename, 'r', newline='') as infile, \
open(output_filename, 'w', newline='') as outfile:
reader = csv.reader(infile, delimiter=' ', skipinitialspace=True)
writer = csv.writer(outfile, delimiter=',')
for row in reader:
new_cols = row[0].split('.')
if not new_cols[1].endswith('*'):
new_cols.extend([''])
else:
new_cols[1] = new_cols[1][:-1]
new_cols.extend(['*'])
row = new_cols + row[1:]
#print(row)
writer.writerow(row)