如何从txt文件中用逗号分隔替换号码?

时间:2015-11-16 17:07:22

标签: python regex bigdata jython

我需要一些关于如何用点和单独的数字替换逗号的建议和建议。我解释得很好。

这是我从文件中得到的: 12,1899995803833,0,135000005364418,0,0582966990768909 13,0600004196167,0,141000002622604,0,098975196480751

我的问题是首先我需要用点替换一些逗号,特别是我需要替换第一个,第三个,第五个逗号并留下第二个和第四个逗号。然后我需要减少有意义数字的数量并放置一个标签,如下所示:

12.18,0.13,0.05 13.06,0.14,0.09

正如您所看到的那样,两个原始数据的长度不同,因此我无法在特定位置更改元素。 我想为每个原始创建一个单独的字符串,然后在查看平均位置后指定一个范围。 例如,第一个逗号始终是第2个,第3个或第4个字符。所以我可以说“ïf在这个位置范围内有一个,改变它。” 但这不是其他逗号的情况,因为差异可能非常大,例如

29,3099994659424,0,521000027656555,2,40029883384705 29,75,0,531000018119812,2,46150183677673

(这就是我想要的: 29.30,0.52,2.40 29.75,0.53,2.46)

我想要运行该程序超过1次,所以首先我替换第一个逗号并删除第二个数字后面的所有数字,然后我对其他2个列做同样但看起来很长(我有很多) txt文件)。 其他方式可能是: - 为每个逗号分配一个真/假值,然后循环播放一个循环 - 将列表中的所有数字分开,然后在1-3-5位置调用它们调用int,2-4-6调用它们dec并使用write text函数,直接写入int,dec

我可以使用正则表达式吗?你知道我正在研究的两个更优雅的方式吗? 另外,你能描绘一下如何设置程序吗?几年前我在大学做过关于Jython编程的课程,但我记不太清楚了。 谢谢大家!

2 个答案:

答案 0 :(得分:1)

也许有一种更优雅的方式,但我尝试在'行'上循环,然后在逗号上分割每一行,然后成对处理这些片段:

text = """12,1899995803833,0,135000005364418,0,0582966990768909
          13,0600004196167,0,141000002622604,0,098975196480751
          29,3099994659424,0,521000027656555,2,40029883384705
          29,75,0,531000018119812,2,46150183677673"""

# First make the floats as a list of lists.
out = []
for row in text.split():
    items = row.split(',')
    ints, decs = items[::2], items[1::2]
    outrow = []
    for i, d in zip(ints, decs):
        outrow.append(float('{0}.{1}'.format(i, d)))
    out.append(outrow)

# Now we have a list of lists. Format them as text.
result = '{0:>8s}{1:>8s}{2:>8s}\n'.format('A', 'B', 'C')
for row in out:
    result += '{0:8.2f}{1:8.2f}{2:8.2f}\n'.format(*row)

print(result)

在Python str.format()中使用the formatting 'minilanguage'。你可以用它做各种各样的事情。

这给出了:

    A       B       C
12.19    0.14    0.06
13.06    0.14    0.10
29.31    0.52    2.40
29.75    0.53    2.46

您也可以直接使用out作为浮点数组,例如在NumPy。

答案 1 :(得分:0)

使用标准库中的re来实现交替替换','到'。'在每一行。

import re
rows = [[float(num) for num in re.sub(r'(\d+),(\d+)',r'\1.\2',row).split(',')] for row in text.split()]

例如:

text = """12,1899995803833,0,135000005364418,0,0582966990768909
          13,0600004196167,0,141000002622604,0,098975196480751
          29,3099994659424,0,521000027656555,2,40029883384705
          29,75,0,531000018119812,2,46150183677673"""

将使用列表解析生成以下内容:

rows
>>>[[12.1899995803833, 0.135000005364418, 0.0582966990768909],
 [13.0600004196167, 0.141000002622604, 0.098975196480751],
 [29.3099994659424, 0.521000027656555, 2.40029883384705],
 [29.75, 0.531000018119812, 2.46150183677673]]

除了@kwinkunks提供的格式之外,我没有进一步添加格式。基于他的回答,您可以通过执行以下操作将rows列表列表转换为可打印的字符串:

printable=''.join(['{0:8.2f}{1:8.2f}{2:8.2f}\n'.format(*row) for row in rows])