随笔录--csv文件批处理问题常见应用脚本

1.按时间区分脚本

数据样式:

 阿尔法|@|手动阀|@|啊发生的|@|的说法|@|撒地方|@|撒地方|@|士大夫大师傅|@|法国德国|@|地方都是|@|分割|@|对方是个|@|当时法国代购|@|的风格|@|对方的|@|2023/01/01|@|上帝发誓|@|打法,上面代表一笔数据,假设有1000条数据,遍历每行,取第14个"|@|"后面的时间进行比较。输入区间时间,利于左开右闭规则,得到在这个区间内符合规则的数据,输出到一个以区间时间命名的csv中


from datetime import datetime

import os



# 定义时间范围

start_date = datetime.strptime('20230101', '%Y%m%d')

end_date = datetime.strptime('20230501', '%Y%m%d')



# 指定输出文件夹

output_folder = 'output_folder'



# 确保输出文件夹存在,如果不存在则创建

if not os.path.exists(output_folder):

    os.makedirs(output_folder)



# 生成 CSV 文件名

output_file_name = f"{output_folder}/{start_date.strftime('%Y%m%d')}_{end_date.strftime('%Y%m%d')}.csv"



# 读取数据文件并进行处理

with open('input_data.txt', 'r') as input_file, open(output_file_name, 'w') as output_file:

    for line in input_file:

        cleaned_line = line.strip()



        # 检查是否为空行

        if cleaned_line:

            fields = cleaned_line.split('|@|')

            if len(fields) >= 14:

                date_str = fields[13].strip()

                try:

                    data_date = datetime.strptime(date_str, '%Y/%m/%d')

                    if start_date < data_date <= end_date:

                        output_file.write('|@|'.join(fields) + '\n')

                except ValueError:

                    pass

2.按场景区别脚本

数据样式

假设有批量数据.csv,一行是一条数据,每条数据有22个值,每个值用|@|隔开,例如:法大师傅|@|撒地方|@|范德萨|@|等等,

第一行第一个字段值是'法大师傅",批量数据一共涉及了10个场景,写一个函数,输入场景字段的值,就能分割出特定场景的数据.csv文件


import csv

import os



def filter_csv_by_scene(csv_file, scene_field_index, target_scene, output_folder):

    with open(csv_file, 'r', newline='', encoding='utf-8') as file:

        reader = csv.reader(file)



        filtered_rows = []



        for row in reader:

            if len(row) > scene_field_index:

                scene_values = row[scene_field_index].split('|@|')

                if target_scene in scene_values:

                    filtered_rows.append(row)



        # 确定输出文件的路径和文件名

        output_file_path = os.path.join(output_folder, f"{target_scene}.csv")



        # 将筛选后的数据写入文件

        with open(output_file_path, 'w', newline='', encoding='utf-8') as output_file:

            writer = csv.writer(output_file)

            writer.writerows(filtered_rows)
示例用法

filter_csv_by_scene('批量数据.csv', 0, '特定场景', '输出文件夹')  # 假设场景字段在第一列,索引为0;指定特定场景为 '特定场景';将结果写入指定的输出文件夹中,文件名为 '特定场景.csv'

2.1带标题行的

import csv



def filter_csv_by_scene(csv_file, scene_field_index, target_scene):

    with open(csv_file, 'r', newline='') as file:

        reader = csv.reader(file)

        header = next(reader)  # 获取标题行



        filtered_rows = []



        for row in reader:

            if len(row) > scene_field_index:

                scene_values = row[scene_field_index].split('|@|')

                if target_scene in scene_values:

                    filtered_rows.append(row)



        # 将筛选后的数据写入文件

        output_file = open(f'{target_scene}.csv', 'w', newline='')

        writer = csv.writer(output_file)

        writer.writerow(header)  # 写入标题行

        writer.writerows(filtered_rows)

        output_file.close()

 示例用法

filter_csv_by_scene('批量数据.csv', 0, '特定场景')  # 假设场景字段在第一列,索引为0;指定特定场景为 '特定场景'.

2.2 不带标题行

数据样式:

阿尔法|@|手动阀|@|啊发生的|@|的说法|@|撒地方|@|撒地方|@|士大夫大师傅|@|法国德国|@|地方都是|@|分割|@|对方是个|@|当时法国代购|@|的风格|@|对方的|@|2023/01/01|@|上帝发誓|@|打法,假设有批量数据.csv,一行是一条数据,每条数据有多个值,每个值用|@|隔开,例如:法大师傅|@|撒地方|@|范德萨|@|等等,

第一行第一个字段值是'法大师傅",批量数据一共涉及了两个部门,多个场景,写一个函数,输入特定部门里面多个部门的值,就能分割出特定场景的数据.csv文件.


import csv



def split_data(scene_list, input_file, output_file):

    with open(input_file, 'r', encoding='utf-8') as file:

        reader = csv.reader(file)



        with open(output_file, 'w', newline='', encoding='utf-8') as output:

            writer = csv.writer(output)



            for row in reader:

                if row[0].split('|@|')[0] in scene_list:  # 假设场景字段在第一列(索引为0)

                    writer.writerow(row)  # 写入符合条件的行



    print(f"已将特定场景数据分割到文件'{output_file}'中。")

```

### 使用示例

scene_list = ['特定场景1', '特定场景2', '特定场景3']  # 手动输入的场景列表

split_data(scene_list, '批量数据.csv', '特定场景数据.csv')
【拓展】

"\n"是换行符的转义字符,在文本中表示换行。它通常出现在计算机程序代码或电子邮件中,用于在不同行之间分隔内容。

在不同的操作系统中,换行的表示方式可能略有不同,Unix/Linux系统通常使用"\n"表示换行,而Windows系统使用"\r\n"表示换行。

2.3 分割脚本

假设有99.1万条数据的.csv,每一万条数据一分割,生成n个txt,类似分割表#100#1.txt,分割表#100#2.txt,分割表#100#3.txt,分割表#100#4.txt这样的文件命名,再给定一行表头内容,在每个分割表的首行添加该表头,

因为每条数据长度都是不一样的,尽量不要用pd.read_csv方法,只需要做按数据条数分割文件,然后把表头加到每个分割文件的第一行即可.


import os



def split_csv_to_txt(input_csv, output_dir, chunk_size, header):

    # 创建输出目录

    os.makedirs(output_dir, exist_ok=True)



    # 打开输入文件

    with open(input_csv, 'r', encoding='utf-8-sig') as infile:

        data = infile.readlines()



    # 计算总行数

    total_rows = len(data)



    # 计算分割表的总数

    tables_count = (total_rows // chunk_size) + 1



    # 按每一万条数据分割CSV并生成TXT文件

    for i in range(0, total_rows, chunk_size):

        # 计算分割表的编号

        table_number = i // (total_rows // tables_count) + 1



        # 构建TXT文件名

        txt_file_name = f'分割表#{table_number}#{i + 1}.txt'

        txt_file_path = os.path.join(output_dir, txt_file_name)



        # 在每个文件的首行添加表头

        with open(txt_file_path, 'w', encoding='utf-8') as txt_file:

            txt_file.write(header + '\n')

            # 写入分割的数据

            txt_file.writelines(data[i:i + chunk_size])



    print('分割和处理完成。')
使用方法示例:
csv_file_path = 'your_file.csv'  # 替换为你的CSV文件路径

output_directory = 'output_txt_files'  # 替换为输出目录

chunk_size = 10000  # 替换为每个TXT文件拆分的数据量

header = 'your_header'  # 替换为你的表头内容



split_csv_to_txt(csv_file_path, output_directory, chunk_size, header)

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值