Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将原始文本转换为csv_Python_R_Csv - Fatal编程技术网

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)