将原始文本转换为cs

2024-10-04 05:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个原始数据集(纯文本)。三个样本行如下:

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

我想把它转换成csv文件。我该怎么做?(我喜欢Python或R)

csv文件应该类似于:

^{pr2}$

Tags: 文件csv文本原始数据样本buffalobaypr2
3条回答

我使用了前8行数据进行测试。第9行是再见,我想你应该用不同的方式来处理这些问题。如果没有,则发布问题构造代码,这在说明边缘情况时更为彻底。这与(字母.句点.2nums)(空格|星号)(空格)(字母.句点,在读取前插入逗号。在

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项:

^{pr2}$

最后一个解析尾随材料的步骤可能是通过另一个调用读表,这次只使用默认的空格分隔符。如果需要逐行分析,也可以使用scan-函数:

> 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

如果您查看链接到的网页的源文件http://www.goldsheet.com/nflog.php,您将看到每行数据都包含在一个<p>元素中,并且在每个字段之间有一个包含空格的<span>。源代码如下(为了清晰起见,我添加了换行符):

<p>
S.11*
<span>&#160;&#160;</span>
N. ENGLAND
<span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
L
<span>&#160;&#160;&#160;&#160;&#160;&#160;</span>
-8'
<span>&#160;&#160;&#160;&#160;</span>
21-23
<span>&#160;&#160;</span>
u44'
</p>

这意味着在HTML源代码中,您可以区分分隔字段的空格和城市名称中的空格之间的区别,这解决了导入这些数据的最大问题。因此,最好的策略可能是使用Python中的lxml之类的东西来解析页面源代码中的数据。在获得每个字段之后,需要进行一些后处理,以便将第一个字段中的“*”等内容拆分为指定的单独列。然后您可以轻松地从Python导出到csv。在

然而,更大的问题是,这些数据几乎肯定是通过手动输入生成的,这意味着随着时间的推移,数据很可能会出现细微的不一致。随着您修复越来越多的这些问题,您的解析代码将成为特殊情况的负担。因此,您应该考虑您想要做的事情是否值得维护如此混乱的代码。在

您可以使用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输出文件的内容:

^{pr2}$

相关问题 更多 >