2016-04-20 17:37:22 yun__yang 阅读数 17011
  • 大数据Spark实战视频教程

    大数据Spark实战视频培训教程:本课程内容涉及,Spark虚拟机安装、Spark表配置、平台搭建、快学Scala入门、Spark集群通信、任务调度、持久化等实战内容。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

    34871 人正在学习 去看看 张长志

在工作中,很多时候需要把excel中的数据读取出来,导入到mysql中,以前的代码,都是通过 Spreadsheet_Excel_Reader插件直接取出来,进行for循环,组合成一个长的sql语句,这样进行插入,但是这样的导入有不足之处就是如果导入的数据量庞大,那么会造成长语句超出sql最大限制。并且执行时间超长,会超出php脚本执行时间下面贴一段原先的代码。

require_once 'Excel/reader.php';//调用Reader,引用地址可以任意,正确即可
$data = new Spreadsheet_Excel_Reader(); //创建 Reader
$data->setOutputEncoding('utf-8');//设置文本输出编码
$data->read($uploadfile);//读取Excel文件
$insert = '';
for ($i = 0; $i < $data->sheets[0]['numRows']; $i++) {
$insert .= "('".$data->sheets[0]['cells'][$i][1]."','".$data->sheets[0]['cells'][$i][3]."-".$data->sheets[0]['cells'][$i][4]."','".$data->sheets[0]['cells'][$i][7]."--".$data->sheets[0]['cells'][$i][6]."',1,'".$data->sheets[0]['cells'][$i][2]."','".$datetime."','".$data->sheets[0]['cells'][$i][8]."','".$data->sheets[0]['cells'][$i][5]."','".$data->sheets[0]['cells'][$i][8]."'),";
}

用过这款插件的同学应该知道,$data->sheets[0]['numRows']即php读取excel中的记录数,而$data->sheets[0]['cells']为php读取出来的数据,这样调取其实是可以的,但是前提是数据量不大。

数据量稍微大一点就提示以下错误,这是因为发送的SQL语句太长,以致超过了max_allowed_packet的大小,这种情况,你只要修改my.cnf,加大max_allowed_packet的值即可。但是这种虽然可以解决大sql插入问题,但是程序运行的时间也响应的增加了,比如:读取一个5000记录数的excel并插入,居然使用了超过20秒时间。这意味着如果采用此种方法,还需要设置set_time_limit(0);


但是大多数的情况下,不可能频繁的使用小excel文件进行导入,也太繁琐,通过php的前期处理,将大型的sql语句拆分为n多符合条件的sql语句,配合缓冲区,这样做的好处就是:不用考虑因为sql语句太长而造成执行时间超出php限定时间,以及语句太长造成mysql报错。


$len = $data->sheets[0]['numRows'];
		$datacells = $data->sheets[0]['cells'];
		unset($data);
		//以2000条为分界
		$lun = $len / 2000;
		// echo $len.'<br />';
		// echo $lun.'<br />';
		$num = intval($len % 2000);
		if($num == 0){
			$lun = $lun;
		}else{
			if($lun>0){
				$lun = floor($lun);
			}else{
				$lun = 0;
			}
		}
		// echo $lun.'<br />';
		// echo $num;exit;
		set_time_limit(0);
		//插入一条excel记录
		mysql_query("INSERT INTO `excel` (`id`, `oldname`, `newname`, `size`, `time`) VALUES (NULL, '$file', '$uploadfile', '$len','$exceltime');");  
		$insert_id=mysql_insert_id();
		if($lun >= 1){ 
			for($j = 0;$j < $lun;$j++){
				ob_end_clean();
				$insert = '';
				for($i = 0;$i <= 2000;$i++){
					$key=$i+$j*2000;
					if (strlen($datacells[$key][5])>0){
						$datetime=$datacells[$key][5];
					}else{
						$datetime=date('Y-m-d H:i:s');
					}
					// if($datacells[$key][3]){
						$insert .= "('".$datacells[$key][1]."','".$datacells[$key][3]."-".$datacells[$key][4]."','".$datacells[$key][7]."--".$datacells[$key][6]."',1,'".$datacells[$key][2]."','".$datetime."','".$datacells[$key][8]."','".$datacells[$key][5]."','".$datacells[$key][8]."','".$insert_id."'),"; 
					// }
				}
				$insert=trim($insert,',');
				$sql = "INSERT INTO message_bak (tel, addr, y_title, bs, wz, timeadd,ip,uid,telzt,excel_id) VALUES".$insert;
                               //echo $sql;
                                $res != mysql_query($sql);
				if (!$res){
					$msg="SQL语句执行错误".$sql;
				}	
				flush();
			}
		}
                if($lun > 0 && $num > 0){
                    unset($sql);
                    insert = '';
                    for($i = 0;$i <= $num;$i++){
                       $key=($lun-1)*2000+$i;
                       if (strlen($datacells[$key][5])>0){
                          $datetime=$datacells[$key][5];
                       }else{
                          $datetime=date('Y-m-d H:i:s');
                       }
                       $insert .= "('".$datacells[$key][1]."','".$datacells[$key][3]."-".$datacells[$key][4]."','".$datacells[$key][7]."--".$datacells[$key][6]."',1,'".$datacells[$key][2]."','".$datetime."','".$datacells[$key][8]."','".$datacells[$key][5]."','".$datacells[$key][8]."','".$insert_id."'),"; 
                    }
                    $insert=trim($insert,',');
                    $sql = "INSERT INTO message_bak (tel, addr, y_title, bs, wz, timeadd,ip,uid,telzt,excel_id) VALUES".$insert;
                    $res = mysql_query($sql);

                }elseif($num > 0){
                    unset($sql);
                    insert = '';
                    for($i = 0;$i <= $num;$i++){
                       $key=$i;
                       if (strlen($datacells[$key][5])>0){
                          $datetime=$datacells[$key][5];
                       }else{
                          $datetime=date('Y-m-d H:i:s');
                       }
                       $insert .= "('".$datacells[$key][1]."','".$datacells[$key][3]."-".$datacells[$key][4]."','".$datacells[$key][7]."--".$datacells[$key][6]."',1,'".$datacells[$key][2]."','".$datetime."','".$datacells[$key][8]."','".$datacells[$key][5]."','".$datacells[$key][8]."','".$insert_id."'),"; 
                    }
                    $insert=trim($insert,',');
                    $sql = "INSERT INTO message_bak (tel, addr, y_title, bs, wz, timeadd,ip,uid,telzt,excel_id) VALUES".$insert;
                    $res = mysql_query($sql);
                }
这里将$data中的数据提出并且销毁$data了。目的是要代码简便点,不过实际环境中无需如此,目前通过上面的程序,导入一个10000条的excel文件,仅需要

6秒。当然如果取消对变量的操作,再优化优化程序(缓冲区的使用是为了实时显示出来每次执行的sql语句,如果不需要这种做法,当然可以放弃使用缓冲区),与excel类,速度应该还会更快一点,以下为程序执行时间对比:


 5.7213270664215   单独使用excel类读取数据花费的时间

 6.3743650913239   使用excel类读取数据以及插入数据库所使用的时间

    由此可以看出,大部分时间是花费在了读取excel上面,使用缓冲区插入msyql还是比较可取的,有个小提示,每一次使用缓冲区之后一定要进行 刷新操作

以上只是我的测试代码,具体的sql需要根据各位同学们的需求进行改写,而且上面的代码增加了一个关于导入数据的字典表,即实时导入数据的操作记录,不需要的也可以删除


2015-08-26 14:59:23 ShenYuanLuo 阅读数 2656
  • 大数据Spark实战视频教程

    大数据Spark实战视频培训教程:本课程内容涉及,Spark虚拟机安装、Spark表配置、平台搭建、快学Scala入门、Spark集群通信、任务调度、持久化等实战内容。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

    34871 人正在学习 去看看 张长志

在 c 语言中,文件操作都是由库函数来实现的,主要是分为两种操作:

文件指针

平常所说的文件不同于其他常见的数据类型,比如一个test.txt文档,它有自己的一些属性,比如文件的当前位置、与该文件对应的内存缓冲区地址、文件操作方式等等。对于这些信息都会专门开辟一定内存空间来存储。而且是保存在一个结构体类型变量中,比如:

struct
{
   int fd;           //文件号
   int cleft;        //缓冲区中剩下的字符
   int mode;         //文件操作模式
   char *nextc;      //下一个字符位置
   char *buff;       //文件缓冲区位置
}FILE;
/*FILE是一个存储文件信息的结构体类型的变量*/
在上述代码中可以看到,文件号、文件操作模式等信息都存储在一个结构体中。

这个结构体是系统自己定义的,定义在stdio.h头文件中,取名为FILE。也就是说FILE是系统名称,不可改变的,不是自定义。

所以只要程序用到一个文件,系统就为此文件开辟一个如上的结构体变量。需要几个文件,系统就开辟几个这样的结构体。

这些结构体变量不用变量名来标识,而是通过指向结构体类型的指针变量去访问,这就是文件指针

比如:FILE *fp1,*fp2,*fp3; 当引用文件时,就可以把这个文件的结构体首地址赋给某个文件指针(*fp1,通过*fp1就可以调用结构体以找到相关的信息。

一般来说,有多少个文件就有多少个结构体,有多少结构体就有多少个文件指针。

对磁盘文件的操作必须是先打开,然后读写操作,最后关闭


打开文件


函数原型

FILE * fopen(const char * path,const char * mode);
path:需要打开的文件路径
mode:文件打开方式
返回值文件顺利打开后,返回指向该流的文件指针。如果文件打开失败则返回NULL,并把错误代码存在errno中。(errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义)
其中文件打开方式主要有一下几种:

文件使用方式

含义

r”(只读)

为输入打开一个文本文件

w(只写)

为输出打开一个文本文件

a(追加)

为文本文件尾增加数据

rb(只读)

为输入打开一个二进制文件

wb(只写)

为输出打开一个二进制文件

ab(追加)

向二进制文件尾增加数据

r+(读写)

为读写打开一个文本文件

w+(读写)

为读写打开一个新的文本文件

a+(读写)

为读写打开一个文本文件

rb+(读写)

为读写打开一个二进制文件

wb+(读写)

为读写建立一个新的二进制文件

ab+(读写)

为读写打开一个二进制文件

t(文本文件)可以省略不写

总结为:r为读 w为写 b为二进制文件 a为追加 +为读写。可以组合使用

关闭文件


函数原型:
int fclose( FILE *fp );
返回值:如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。)

读写文件


常用的文件读写函数主要有:

字符读写函数:fgetc() 和 fputc (getc 和 putc)

字符串读写函数:fgets() 和 fputs()

数据块读写函数:fread() 和 fwrite()

格式化读写函数:fscanf() 和 fprintf()


fread()


函数原型

size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
功能从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。
buffer用于接收数据的内存地址。
size要读的每个数据项的字节数,单位是字节(byte)。
count要读count个数据项,每个数据项size个字节。
stream:文件输入流
返回值实际读取的元素个数。如果返回值与count不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。

fwrite()


函数原型

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
功能向文件写入一个数据块(注意:这个函数以二进制形式对文件进行操作,不局限于文本文件)。
buffer:是一个指针,对fwrite来说,是要获取数据的地址(即数据来源地址)。
size要写入内容的单字节数。
count要进行写入size字节的数据项的个数。
stream目标文件指针。
返回值返回实际写入的数据块数目。

fseek()

函数原型

int fseek(FILE *stream, long offset, int fromwhere);
功能:重定位流(数据流/文件)上的文件内部位置指针(即:可以移动文件的读写指针到指定的位置,即移动当前文件的位置指针)。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
stream:文件指针。
offset:偏移量。
fromwhere:指针的起始位置,为下列其中一种
SEEK_SET:从距离文件开头 offset 位移量为新的读写位置;
SEEK_CUR :以目前的读写位置往后增加 offset 个位移量;
SEEK_END :将读写位置指向文件末尾后再增加 offset 个位移量。

ftell()

函数原型

long ftell(FILE *stream);
功能用于获取文件位置指针当前位置相对于文件首的偏移字节数。(使用fseek()后再调用函数ftell()就能非常容易地确定文件的当前位置。
strem:文件指针。(注意文件指针必须是有效的,且必须指向一个通过 fopen() 或 popen() 成功打开的文件。在附加模式(加参数 "a" 打开文件)中 ftell() 会返回未定义错误
返回值 handle指定的文件指针的位置,也就是文件流中的偏移量。如果出错,返回 FALSE
约束因为ftell返回long型,根据long型的取值范围-231~231-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错。

改变文件大小

ftruncate()

函数原型
int ftruncate(int fd,off_t length);
功能:将参数fd指定的文件大小改为参数length指定的大小。
fd:为已打开的文件描述词,而且必须是以写入模式打开的文件。
length:要改成的大小,如果原来的文件大小比参数length大,则超过的部分会被删去。
返回值:执行成功则返回0,失败返回-1,错误原因存于errno
        EBADF 参数fd文件描述词为无效的或该文件已关闭。
         EINVAL 参数fd 为一socket 并非文件,或是该文件并非以写入模式打开。
说明:fd一般可以fileno(FILE *fp)获取,标示文件当前的大小,lenggth则可由用户定义。此函数一般用在文件初始化或者重新为文件分配空间时。

fileno()

函数原型
int _fileno( FILE *stream );
功能:用来取得参数stream指定的文件流所使用的文件描述符。
stream:文件输入流。
返回值:某个数据流的文件描述符。



下面简单讲一下在iOS 下,对NSData 的文件读写:

读文件

/*
 * ===  FUNCTION  ==================================================
 *         Name:  readDataToBuffer:fromPath:
 *  Description:  从指定 path 的文件读取内容到 buffer
 * =================================================================
 */
-(void)readDataToBuffer:(char *)buffer fromPath:(NSString *)path
{
    
    FILE *p_r= fopen([path cStringUsingEncoding:NSUTF8StringEncoding], "r");  //打开文件
    if (NULL == p_r)
    {
        NSLog(@"Open file error to read data !");
        return ;
    }

    fseek(p_r, 0, SEEK_END);                //定位到文件末尾
    NSInteger dataLength = ftell(p_r);      //获取文件长度
    fseek(p_r, 0, SEEK_SET);                //定位到文件起始位置
    fread(buffer, dataLength, 1, p_r);      //读取文件到指定的缓冲区
    fclose(p_r);                            //关闭文件

}


写文件

/*
 * ===  FUNCTION  ==================================================
 *         Name:  writeData:toPath:
 *  Description:  把数据写到指定的文件中
 * =================================================================
 */
-(void)writeData:(NSData *)data toPath:(NSString *)path
{
    FILE *p_w= fopen([path cStringUsingEncoding:NSUTF8StringEncoding], "ab");  //已追加二进制方式打开文件
    if (NULL == p_w)
    {
        NSLog(@"Open file error to write data!");
        return ;
    }
    fseek(p_w, 0, SEEK_END);                                 // 移到文件末尾
    fwrite((void *)[data bytes], data.length, 1, p_w);       // 写入数据
    data = nil;
    fclose(p_w);                                             //关闭文件
}


此博文源自 http://blog.csdn.net/shenyuanluo/article/details/48003531


如需转载,请说明博文出处。谢谢!

2010-11-02 10:43:00 cherryalps 阅读数 2698
  • 大数据Spark实战视频教程

    大数据Spark实战视频培训教程:本课程内容涉及,Spark虚拟机安装、Spark表配置、平台搭建、快学Scala入门、Spark集群通信、任务调度、持久化等实战内容。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

    34871 人正在学习 去看看 张长志

C语言可以说是我学习的第一门语言,不过似乎也是忘的最多的一门语言,自从因为项目需要重新拾起C语言,我的噩梦就开始了。

依稀记得大二学习数据结构时编程解决“约瑟夫环”、“迷宫”等问题后的骄傲,认为C简直就是天神一般的语言,如此强大,如此让人着迷。后来学了C++,后来开始搞.net,后来自学了CSS和简要的PHP,当C快被我抛弃的时候,由于种种原因,被分到一个新的项目,重新开始做C编程。

继语法树构造完之后自我放假了好久,这两天开工写了一段文件处理的代码,发现以前学习的C语言知识确实完全还给老师了,小崔,我对不起你啊,下面是遭遇问题小结。

1. 字符型转化为整型

如果不是正好用到,我想我永远不会知道居然还有标准库函数可以将字符串转换为任意类型(整型、长整型、浮点型等),我太无知了,我居然只知道强制类型转换,却从来没想过对于字符串要怎样处理,不过还好有人跟我一样不知道,哼哼。

atof():将字符串转换为双精度浮点型值;
atoi():将字符串转换为整型值;
atol():将字符串转换为长整型值;
strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字;
strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字;
strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。

用法非常简单,举例说明如下:

运行结果如下:

cherry@ubuntu:~$ gcc test.c -o test
cherry@ubuntu:~$ ./test
lineno_str : 123
lineno_int : 123

2. 在文件指定行的末尾添加信息

找到某一行还是很容易的,但是在文件中进行插入比较麻烦,本来以为找到指定行直接在末尾添加就可以了,结果悲剧的发现后面的东西被替换了,惆怅。google了下发现文件的内容在缓冲区中是按字节顺序操作的,所以修改文件内容是顺序操作,在某位置修改时会把原始存放在该位置的内容给替换掉,而不是在文件的当前位置插入你修改的内容。

无奈只好走了一条曲折的路线,逐行读取原文件,如不是待修改行则直接拷贝到新建的一个临时文件,如是待修改行则进行修改后再拷贝过去,然后将原来的文件删除,将临时文件重命名为原来的文件。由于要修改好几行,来来回回反反复复还真是麻烦,谁有更好的方法记得告诉我啊。

由于这段代码比较长,就不贴出来了占篇幅了,只附一段逐行读取文件的吧,虽然这块是从网上找来然后修改的,嘿嘿。

 
(2010年8月31日)
2018-06-27 11:46:58 HD2killers 阅读数 7315
  • 大数据Spark实战视频教程

    大数据Spark实战视频培训教程:本课程内容涉及,Spark虚拟机安装、Spark表配置、平台搭建、快学Scala入门、Spark集群通信、任务调度、持久化等实战内容。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

    34871 人正在学习 去看看 张长志

phpexcel不再维护,使用PhpSpreadsheet

官方地址
github

安装

composer require phpoffice/phpspreadsheet

例子

class Vcard
{
    public function index()
    {
        $file_name = "1";
        $uploadwork    = "C:\Users\Administrator\Desktop\城市\二线城市(30个)27575条\\";
        $uploadfile    = $uploadwork.$file_name.'.xlsx';
        $reader        = \PHPExcel_IOFactory::createReader('excel2007'); //设置以Excel5格式(Excel97-2003工作簿)
        $PHPExcel      = $reader->load($uploadfile); // 载入excel文件
        $sheet         = $PHPExcel->getSheet(0); // 读取第一個工作表
        $highestRow    = $sheet->getHighestRow(); // 取得总行数
        $highestColumm = $sheet->getHighestColumn(); // 取得总列数
        $data          = [];
        for ($row = 2; $row <= $highestRow; $row++) //行号从1开始
        {
            for ($column = 'A'; $column <= $highestColumm; $column++) //列数是以A列开始
            {
                if (empty($sheet->getCell($column . $row)->getValue()) == false) {
                    if (empty($data[$row]) == false) {
                        $str = $sheet->getCell($column . $row)->getValue();
                        if (strlen($str)>11) {
                            $pieces = explode("|", $str);
                            $data[$row]['mobile'] = $pieces[0];
                        }else{
                            $data[$row]['mobile'] = $str;
                        }
                    } else {
                        $data[$row]['name'] = $sheet->getCell($column . $row)->getValue();
                    }
                }
            }
        }
        // dump($data);
        $myfile = fopen($uploadwork.$file_name.".vcf", "w") or die("Unable to open file!");
        foreach ($data as $key => $value) {
            $all_str = $this->make_vcard($value['name'], $value['mobile']);
            fwrite($myfile, $all_str);
        }
        fclose($myfile);
    }
}
2012-07-16 13:31:42 onetwofree 阅读数 1866
  • 大数据Spark实战视频教程

    大数据Spark实战视频培训教程:本课程内容涉及,Spark虚拟机安装、Spark表配置、平台搭建、快学Scala入门、Spark集群通信、任务调度、持久化等实战内容。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

    34871 人正在学习 去看看 张长志

WebNoteEditor.HttpUpload断点续传上传控件介绍

 

WebNoteEditor.HttpUpload(以下简称HttpUpload)是分段读取本地文件向服务器端post数据,她可以由javascript自由控制分段大小,可以结合服务器端用asp,.net,php,jsp编写的程序实现断点续传的业务流程。

演示视频下载:http://www.webnoteeditor.com/download/vediohttpupload.rar

 

本插件不提供数字签名,提供本地安装包。安装后在ie内核的浏览器即可使用,无需再次确认允许运行。

http://item.taobao.com/item.htm?id=14255026178

旺旺不在线,只有交易的时候开一下。
购买编辑器或其他软件的朋友请先用QQ(20525769)咨询了解清楚后,再联系购买。

 

 

价格

1000

文件允许上传大小

不限制

支持的浏览器

IE内核的浏览器均可

使用期限

不限制

销售内容

  • AspJspPhp.net的调用例子
  • 1个授权文件
  • 接口说明文档

技术支持服务时限

4

技术支持服务范围

仅关于本控件的调测,如需要我方代购买方整合到实际应用。具体另外友好商谈。

 

 

*授权限制说明:

 

以域名根授权,*.yourdomain.com。譬如http://www.yourdomain.com/yourdomain.com被视为一个域名。

 

如果用于公网ip,那么可以单一ip授权。如果用于局域网,可以ip授权前三段,末段可变。

java读取csv文件

阅读数 27105

没有更多推荐了,返回首页