大文件文本数据处理

1.切割与合并

 #define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
char *path = "Z:\\I\\尹成清华终极版C语言视频源码文档20150131\\大数据相关数据\\dangdangwang.txt";
char *newpath = "Z:\\I\\尹成清华终极版C语言视频源码文档20150131\\大数据相关数据\\dangdangwangN.txt";
#define N 13180820

int getN(char *path)
{
    FILE *pf = fopen(path, "r");
    if (pf==NULL)
    {
        return -1;
    }
    else
    {

        int i = 0;
        while (!feof(pf))
        {
            char str[256] = { 0 };
            fgets(str, 256, pf);
            i++;
        }

        fclose(pf);
        return i;
    }

、、
}

void space(char *path, int num)
{
    char ** pathes = malloc(sizeof(char*)*num);
    for (int i = 0; i < num;i++)
    {
        pathes[i] = malloc(sizeof(char) * 256);
        sprintf(pathes[i], "Z:\\I\\尹成清华终极版C语言视频源码文档20150131\\大数据相关数据\\dangdangwang%d.txt", i + 1);
        //printf("\n%s", pathes[i]);
    }
    //100  10  10
    //100 9  8*12+4
    FILE *pf = fopen(path, "r");
    if (pf == NULL)
    {
        return -1;
    }
    else
    {
        //100/10=10

        if (N%num == 0)
        {
            //num个,N/num
            for (int i = 0; i <  num;i++)
            {
                FILE *pfw = fopen(pathes[i], "w");//写入
                for (int j = 0; j < N/num;j++)
                {
                    char str[1024] = { 0 };
                    fgets(str, 1024, pf);
                    fputs(str, pfw);//读取一行写入一行
                }
                fclose(pfw);
            }
        }
        else
        {
            //100  9  8*12+4
            for (int i = 0; i < num-1; i++)
            {
                FILE *pfw = fopen(pathes[i], "w");//写入
                for (int j = 0; j < N / (num-1); j++)
                {
                    char str[1024] = { 0 };
                    fgets(str, 1024, pf);
                    fputs(str, pfw);//读取一行写入一行

                }
                fclose(pfw);

            }

            {
                FILE *pfw = fopen(pathes[num-1], "w");//写入
                for (int j = 0; j < N %(num-1); j++)
                {
                    char str[1024] = { 0 };
                    fgets(str, 1024, pf);
                    fputs(str, pfw);//读取一行写入一行
                }
                fclose(pfw);
            }
        }
        fclose(pf);
    }
}

void merge(char *newpath,int n)
{
    char ** pathes = malloc(sizeof(char*)*n);
    for (int i = 0; i < n; i++)
    {
        pathes[i] = malloc(sizeof(char) * 256);
        sprintf(pathes[i], "Z:\\I\\尹成清华终极版C语言视频源码文档20150131\\大数据相关数据\\dangdangwang%d.txt", i + 1);
        //printf("\n%s", pathes[i]);
    }
    FILE *pf = fopen(newpath, "w");
    if (pf == NULL)
    {
        return -1;
    }
    else
    {
        for (int i = 0; i < n;i++)
        {
            FILE *pfr = fopen(pathes[i], "r");

            while (!feof(pfr))
            {
                char str[1024] = { 0 };
                fgets(str, 1024, pfr);
                fputs(str, pf);//读取一行写入一行
            }
            fclose(pfr);
        }
        fclose(pf);
    }
}

void main()
{
    //int num = getN(path);
    //printf("%d", num);获取行数
    int  num;
    scanf("%d", &num);

    space(path, num);
    merge(newpath, num);

    system("pause");
}
时间: 2024-10-19 05:42:16

大文件文本数据处理的相关文章

Linux培训教程 linux系统下分割大文件的方法

在linux中分割大文件,比如一个5gb日志文件,需要把它分成多个小文件,分割后以利于普通的文本编辑器读取. 有时,需要传输20gb的大文件,Linux培训 教程件到另一台服务器,也需要把它分割成多个文件,这样便于传输数据. 以下通过五个不同的例子,来讲解Linux下分割大文件的方法,供大家参考. 例1.以每个文件1000行分割 split命令分割文件成每个文件1000行,并且文件名依次为 [前缀]aa,[前缀]ab, [前缀]ac等,默认的前缀是X,每个文件的行数为1000行. 命令: 复制代

jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一个客户可以对应多个订单,一个订单只属于一个客户! * 建表原则: * 在多的一方创建一个字段,作为外键指向一的一方的主键!!! * 多对多: * 一个学生可以选择多个课程,一个课程也可以被多个学生选择! * 建表原则: * 创建第三张表,第三张表中放入两个字段,作为外键分别指向多对多双方的主键! *

Java使用内存映射实现大文件的上传

在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验. package test; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExc

使用Java处理大文件

http://www.importnew.com/10712.html 本文由 ImportNew - 踏雁寻花 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 我最近要处理一套存储历史实时数据的大文件fx market data,我很快便意识到,使用传统的InputStream不能够将它们读取到内存,因为每一个文件都超过了4G.甚至编辑器都不能够打开这些文件. 在这种特殊情况下,我可以写一个简单的bash脚本将这些文件分成更小的文件块,然后再读取它.但是我不想这样做,

PHP读取CSV大文件导入数据库的示例

对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象. 为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的. 下面这个函数是读取CSV文件中指定的某几行数据: /** * csv_get_lines 读取CSV文件中的某几行数据 * @param $csvfile csv文件路径 * @param $lines 读取行数 * @param $offset 起始行数 * @return array * */ function csv_get

PHP加载大文件时require和file_get_contents的性能对比

在开发过程中发现,用require来加载一个很大(几百K,甚至几兆)的配置文件时,会造成响应超时.如果把这个配置文件的内容序列化后,用file_get_contents获取文件然后反序列化的方法来加载,就会快很多. 经过近两周的研究,大概知道了其中的原因. 首先,还从PHP的流程说起,PHP其实有两个流程,一个是启动的流程,一个是响应请求的流程.PHP作为Apache的一个模块,向Apache注册了两个函数,一个是Aapche启动的时候运行的函数:sapi_startup:一个是Apache接收

C# IO操作(四)大文件拷贝(文件流的使用)、文件编码

     大文件拷贝(文件流的使用).文件编码 首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个G甚至更大的文件,需要通过程序来完成拷贝,就需要用到文件流(因为我们无法做到把文件一次性加载到内存中:事实上,内存也不允许这么干),所以在C#中出现了内存流这个东西.先看下面的内容,File类中的常用读取文件方法会将文件内容一次性全部加载到内存中: 1 string sPath = @"C:\Users\Chens-PC\Desktop\Nginx.txt"; 2 //F

IIS上传大文件

IIS7.0上传文件限制的解决方法 在 Windows7(iis7.5).Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击.指定 ASP 请求的实体主体中允许大小为 200,000 (IIS6为204,800) 个字节,在 iis 6.0 之前的版本中,例如:Windows XP(IIS 5.1),没有限制. 这就造成了文件上传不能超过200k,而事实上是提交数据不能超过200k,你可以

Java中用内存映射处理大文件

在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验. [java] view plain copy package test; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundExceptio