Python 将文本文档中的字符串值分隔到数据帧中

Python 将文本文档中的字符串值分隔到数据帧中,python,regex,pandas,dataframe,csv,Python,Regex,Pandas,Dataframe,Csv,我有一个6000行的文本文件。每行由表示不同列的串字符组成。 例子: 'AS202003402092020MF1003 EXESTBOPF 01163500116000 000120300381R00054000016000WC05瓦塔瓦拉茶锡兰有限公司1M' 上面的表达式是字符串,需要分别提取每一列,如下所示: Borkername = AS Sale year = 2020 Saleno = 0340 sale_dte = 20/9/2020 # date need to be format

我有一个6000行的文本文件。每行由表示不同列的串字符组成。 例子: 'AS202003402092020MF1003 EXESTBOPF 01163500116000 000120300381R00054000016000WC05瓦塔瓦拉茶锡兰有限公司1M'

上面的表达式是字符串,需要分别提取每一列,如下所示:

Borkername = AS
Sale year = 2020
Saleno = 0340
sale_dte = 20/9/2020 # date need to be format
Factoryno = MF1003
Catalogu code= EXEST
Grade =BOPF
Gross weight =01163.50 #decimal point needed
Net Weight = 01160.50 #decimal point needed
Lot_No = 0001
invoice_year = 2020
invoice_no = WC05
price = 000540.00 #decimal point needed
Netweight = 01160.00 #decimal point needed
Buyer = 'Watawala Tea Ceylon Ltd.'
Buyer_code = '1M'
我用正则表达式编写了一段代码,用python将每个字段分隔到熊猫数据框的列中

import re            
import csv
### headings of the dataframe

headings = [
"Borkername", "Sale year", "Saleno", "sale_dte", "Factoryno", "Catalogu code", "Grade", "Gross 
 weight",  "Net Weight", "Lot_No", "invoice_year", "invoice_no", "price", "Netweight", "Buyer", "Buyer_code"]

re_fields = re.compile(r'(.{2})(.{4})(.{3})(.{8})(.{6})(.{5})(.{4})(.{7})(.{7}) (.{4})(.{4})(.{5})(.{8})(.{7}).(.*?) (.{2})$')

with open('input.txt') as f_input, open('output.csv', 'w', newline='') as f_output:
  csv_writer = csv.writer(f_output)
  csv_writer.writerow(headings)

 for line in f_input:
    fields = list(re_fields.match(line).groups())

    fields[3] = "{}.{}.{}".format(fields[3][:2], fields[3][2:4], fields[3][4:])
    fields[7] = float("{}.{}".format(fields[7][:5], fields[7][5:]))
    fields[8] = float("{}.{}".format(fields[8][:5], fields[8][5:]))
    fields[12] = float("{}.{}".format(fields[12][:6], fields[12][6:]))
    fields[13] = float("{}.{}".format(fields[13][:5], fields[13][5:]))

    csv_writer.writerow(fields)
不幸的是,这段代码在尝试时出错

fields = list(re_fields.match(line).groups())
AttributeError:“非类型”对象没有属性“组”

希望技术专家可以建议我以正确的方式来做这件事,同时删除现有的bug 附文本文件样本

AS202003402092020MF1003 EXESTBOPF      01163500116000 000120200381R000540000116000WC05 Watawala Tea 
Ceylon Ltd.                          1M
AS202003402092020MF0663 EXESTBOPF      01123500112000 000420200165R000550000112000WC05 Watawala Tea 
Ceylon Ltd.                          1M
AS202003402092020MF0069 EXESTBOP       00963500096000 000520200278R000570000096000CM01 Ceylon Tea 
Marketing Ltd.                         1M
AS202003402092020MF0069 EXESTBOPF      01103500110000 000620200282R000580000110000CM01 Ceylon Tea 
Marketing Ltd.                         1M
AS202003402092020MF0348 EXESTBOPF      01163500116000 000720200259R000570000116000CM01 Ceylon Tea 
Marketing Ltd.                         1M
AS202003402092020MF0348 EXESTBOPF      01163500116000 000820200264R000560000116000TT01 Tea Tang (Pvt) 
Ltd                                0M
AS202003402092020MF0703 EXESTBOPF      01123500112000 000920200193R000540000112000AB01 Akbar Brothers 
(Pvt) Ltd                          1M
AS202003402092020MF0552 EXESTBOPF      01123500112000 001120200266 000520000112000AB01 Akbar Brothers 
(Pvt) Ltd                          1M
AS202003402092020MF0294 EXESTBOP       01003500100000 001220200097R000560000100000UL01 Unilever 
Lipton Ceylon Ltd, Tea Division          1M

您的正则表达式不适合输入字符串

当您的代码尝试匹配时,将返回None。换句话说,您的字符串不能适合您的模式

我不是regex专家,但是,根据您的示例数据,此模式有效:

r'(.{2})(.{4})(.{3})(.{8})(.{6})(\s*.{5})(.{4})(\s*.{7})(.{7})(\s*.{4})(.{4})(\s*.{5})(.{8})(.{7})(.{4})(.*?)(.{2})$'
我还改变了将字符串拆分为格式并包含小数点的方式。请检查这是否适用于您:

import re            
import csv
### headings of the dataframe

headings = [
"Borkername", "Sale year", "Saleno", "sale_dte", "Factoryno", "Catalogu code", "Grade", "Gross weight",  "Net Weight", "Lot_No", "invoice_year", "invoice_no", "price", "Netweight", "Buyer", "Buyer_code"]

re_fields = re.compile(r'(.{2})(.{4})(.{3})(.{8})(.{6})(\s*.{5})(.{4})(\s*.{7})(.{7})(\s*.{4})(.{4})(\s*.{5})(.{8})(.{7})(.{4})(.*?)(.{2})$')


with open('input.txt') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_writer = csv.writer(f_output)
    csv_writer.writerow(headings)
    
    for line in f_input:
        fields = list(re_fields.match(line).groups())

        fields[3] = "{}.{}.{}".format(fields[3][:2], fields[3][2:4], fields[3][4:])
        fields[7] = float("{}.{}".format(fields[7][:-2], fields[7][-2:]))
        fields[8] = float("{}.{}".format(fields[8][:-2], fields[8][-2:]))
        fields[12] = float("{}.{}".format(fields[12][:6], fields[12][6:]))
        fields[13] = float("{}.{}".format(fields[13][:-2], fields[13][-2:]))

        csv_writer.writerow(fields)


您的正则表达式不适合输入字符串

当您的代码尝试匹配时,将返回None。换句话说,您的字符串不能适合您的模式

我不是regex专家,但是,根据您的示例数据,此模式有效:

r'(.{2})(.{4})(.{3})(.{8})(.{6})(\s*.{5})(.{4})(\s*.{7})(.{7})(\s*.{4})(.{4})(\s*.{5})(.{8})(.{7})(.{4})(.*?)(.{2})$'
我还改变了将字符串拆分为格式并包含小数点的方式。请检查这是否适用于您:

import re            
import csv
### headings of the dataframe

headings = [
"Borkername", "Sale year", "Saleno", "sale_dte", "Factoryno", "Catalogu code", "Grade", "Gross weight",  "Net Weight", "Lot_No", "invoice_year", "invoice_no", "price", "Netweight", "Buyer", "Buyer_code"]

re_fields = re.compile(r'(.{2})(.{4})(.{3})(.{8})(.{6})(\s*.{5})(.{4})(\s*.{7})(.{7})(\s*.{4})(.{4})(\s*.{5})(.{8})(.{7})(.{4})(.*?)(.{2})$')


with open('input.txt') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_writer = csv.writer(f_output)
    csv_writer.writerow(headings)
    
    for line in f_input:
        fields = list(re_fields.match(line).groups())

        fields[3] = "{}.{}.{}".format(fields[3][:2], fields[3][2:4], fields[3][4:])
        fields[7] = float("{}.{}".format(fields[7][:-2], fields[7][-2:]))
        fields[8] = float("{}.{}".format(fields[8][:-2], fields[8][-2:]))
        fields[12] = float("{}.{}".format(fields[12][:6], fields[12][6:]))
        fields[13] = float("{}.{}".format(fields[13][:-2], fields[13][-2:]))

        csv_writer.writerow(fields)


此代码正在运行。您是否能够找到一个解决方案来同时加载多个文件(相同的结构)once@hiran,请不要误会我,我可以注意到你是新来的,我应该提醒你事情是怎么回事。社区也是如此。我们回答的问题不仅是一个人可以学习的,也是整个社区都可以学习的。我们花时间学习为社区提供解决方案。当有人问的时候,他们也应该考虑社区。你可以做到这一点的方法是将问题组织起来,这样其他有同样问题的人将来可以很容易地找到你的问题。因此,如果你有一个新问题,请按照规则创建一个新问题。如果是这样的话,请告知社区,这个答案解决了像你这样的问题,并将这个答案标记为已接受。我知道,这不像雇佣一家专门为你的问题服务的公司那么容易,但这也是你帮助他人的一种方式。:)虽然我想投你赞成票,但我不能这样做,因为我没有15个名声。不管怎样,我会单独问这个问题。不管怎样,谢谢你的回复。现在你就快到了:)这段代码正在工作。您是否能够找到一个解决方案来同时加载多个文件(相同的结构)once@hiran,请不要误会我,我可以注意到你是新来的,我应该提醒你事情是怎么回事。社区也是如此。我们回答的问题不仅是一个人可以学习的,也是整个社区都可以学习的。我们花时间学习为社区提供解决方案。当有人问的时候,他们也应该考虑社区。你可以做到这一点的方法是将问题组织起来,这样其他有同样问题的人将来可以很容易地找到你的问题。因此,如果你有一个新问题,请按照规则创建一个新问题。如果是这样的话,请告知社区,这个答案解决了像你这样的问题,并将这个答案标记为已接受。我知道,这不像雇佣一家专门为你的问题服务的公司那么容易,但这也是你帮助他人的一种方式。:)虽然我想投你赞成票,但我不能这样做,因为我没有15个名声。不管怎样,我会单独问这个问题。不管怎样,谢谢你的回复。现在你就快到了:)