VUE读取Vcard文件,并获取/筛选想要的内容

199 阅读3分钟

 

我是Vcard文件,安卓通讯录,test.vcf,它的固定格式,文件内容如下(里面有四个联系人):

然后我是要获取里面的内容(因为我与后台交互是数据传输,也就是JSON方式),所以我需要获得我需要的姓名N和电话号码CELL就行。

首先我们要做的事读取这个Vcard文件,参考这个可以实现文件读写(任何后缀的文件,类似txt):blog.csdn.net/Make_Progre…

根据它的方法,我打印出来如下:

console.log("读取的内容如下:",this.snippets);

但是问题来了,这样我不能直接获取我想要的内容,可以一行行读取,然后获取,但是js我不熟悉数据流怎么写,java可以

但是,我们知道,如果转换成其他数组获取对象,我们就可以直接获取

所以:this.snippets是读取到的数据,就是上面的

 let temp=this.snippets.split('\n').map(v => v.trim()).sort((a, b) => b.length - a.length)
  console.log("读取的内容如下:");

 

这就直接获取数据编程数组了,举例,

我们获取数组的方式不都是 arry[0]="TEL;TYPE=CELL:3254894"  或者  arry[21]="FN:打麻将" 这样的都是我们要想获取的号码和姓名,这时候我们是要去掉多余部分,就是split(":")方法(因为他们共同特点都是:分开,就是再“:”后面是我们要的),提取数组每个内容,类似这样: ["TEL;TYPE=CELL", "3254894"] 或者 ["FN", "打麻将"] ,这不就简单了?

temp[0].split(":") 这个就获得的结果就是:["TEL;TYPE=CELL", "3254894"] ,数组2不正是你要的结果么,

temp[0].split(":") [1]  这个就获得的结果就是:"3254894"

同理

temp[23].split(":") 这个就获得的结果就是:["N", "打麻将"],数组2不正是你要的结果么,

temp[23].split(":") [1]  这个就获得的结果就是: "打麻将"

循环遍历所有,见我写的

 for(let i=0;i<temp.length;i++){//数组里有多少长度temp.lengt
                         let temp1=temp[i].split(":")[0]//读取每个数组中我们需要的部分,即:TEL;TYPE=CELL和N
                         if(temp1 ==="TEL;TYPE=CELL"){//电话号码
                             console.log("电话号码",temp[i].split(":")[1])//这就是我们需要的号码
                             //然后可以复制到公共变量,供其他方法调用

                         }if(temp1 ==="N"){//名字
                             console.log("姓名",temp[i].split(":")[1])//这就是我们需要的名字
                              //然后可以复制到公共变量,供其他方法调用
                         }
                    }

 

 

整个代码如下:

VUE肯定先写html部分(采用element的el-upload):

<div id="dialog_imports" style="display:none;margin-top: 0.3rem;">
            <div class="scrollcelue2" id="tabs-2">
                <div id="import_buju">

                    <el-upload
                            style="margin-left:2.7rem;"
                            action=""
                            class="upload-demo"
                            accept=".xlsx,.xls,.csv,.vcf"
                            ref="upload"
                            :on-change="importFile"
                            :auto-upload="false"
                            :limit="1">
                        <el-button slot="trigger" size="small" type="primary" >选取文件</el-button>
                        <el-button style="margin-left: 10px;" size="small" type="success" @click="httpRequest">点击上传</el-button>
                        <div slot="tip" class="el-upload__tip">若已选择文件,先把该文件取消,否则无法选择其他文件</div>
                    </el-upload>


            </div>
        </div>

 

然后,再data处,需要什么变量就用什么,自己看看那些带this.xxx就是,这里就省略!

最后就是技术部分,即:methods:{}写方法的部分

1.选择文件按钮

importFile(file){
                //原生选择文件按钮适用
                 //     var objFile = document.getElementById('fileid').files[0];//element框架不适用,仅用于原生js
                var objFile = file.raw;
                var objStr = /\.(xlsx|xls|csv|vcf)$/; 
                if(!objStr.test(objFile.name)){
                    this.$alert('选择的文件格式不对,请选对格式', '警告', {
                        confirmButtonText: '确定',
                    });
                    return false;
                }else{
                    this.suffix = objFile.name.split('.')[1];
                }

                if (typeof FileReader === "undefined") {  //用来判断你的浏览器是否支持 FileReader
                    this.$message({
                        type: "info",
                        message: "您的浏览器不支持文件读取。"
                    });
                    return;
                }
                this.thisObj=objFile;
                console.log("选中的xlsx文件",this.thisObj);
                

         },

2.点击上传按钮

 httpRequest() {//上传按钮,取消
            this.isUploadflag = true;
            var imageLocations = new Array();//存放文件内容--原始内容
            var temp = new Array();//存放文件内容--每行转换为数组

            if(this.suffix  === "xlsx" || this.suffix === "xls" || this.suffix === "csv"){
                console.log("选择得是EXCEL格式",this.suffix,"文件名",this.thisObj)
                this.$root.DataBus.setElsxFile(this.thisObj);//如果木有上传这步,elsxData这个就获取不到
                this.fileFlod = "isExcel";
                this.$message({
                    message: '已上传文件,可继续下一步!',
                    type: 'success'
                });
            }else if(this.suffix  === "vcf"){
                this.fileFlod = "isVcard";
                //element得upload上传按钮适用
                let reader = new FileReader();   //先new 一个读文件的对象 FileReader
                //  reader.readAsText(file.raw, "gb2312");  //读.txt文件
                reader.readAsArrayBuffer(this.thisObj); //读任意文件
                console.log("文件名:",this.thisObj.name);
                                
                reader.onload = e =>{
                    var $this = this;
                    var ints = new Uint8Array(e.target.result); //要使用读取的内容,所以将读取内容转化成Uint8Array
                    // ints = ints.slice(0, 5000); //截取一段读取的内容
                   this.snippets = new TextDecoder('utf-8').decode(ints); //gb2312二进制缓存区内容转化成中文(即也就是读取到的内容)
                   // console.log("读取的内容如下imageLocations:",this.snippets);

                    temp=this.snippets.split('\n').map(v => v.trim()).sort((a, b) => b.length - a.length)//每一行转换成数组好获取想要的
                    // console.log("读取的内容如下temp:",temp);

                    for(let i=0;i<temp.length;i++){//数组里有多少长度temp.lengt
                         let temp1=temp[i].split(":")[0]//读取每个数组中我们需要的部分,即:TEL;TYPE=CELL和N

                         if(temp1 ==="TEL;TYPE=CELL"){
                            console.log("电话号码",temp[i].split(":")[1]);

                            if(temp[i].split(":")[1] ==""){
                                this.$alert('导入的Vcard文件中:号码存在为空,不能继续添加,请检查!', '警告', {
                                    confirmButtonText: '确定',
                                });
                                return false;    
                            }else{
                                this.snippets1.push(temp[i].split(":")[1]);
                            }
                            
                         }if(temp1 ==="N"){
                             console.log("姓名",temp[i].split(":")[1]);
                             if(temp[i].split(":")[1] ==""){
                                this.$alert('导入的Vcard文件中:姓名存在为空,不能继续添加,请检查!', '警告', {
                                    confirmButtonText: '确定',
                                });
                                return false;    
                             }else{
                                this.snippets2.push(temp[i].split(":")[1]);
                             }  
                         }
                    }  
                }
                this.$message({
                    message: '已上传文件,可继续下一步!',
                    type: 'success'
                });
            }else{
                this.$alert('请选择正确文件后再上传', '警告', {
                    confirmButtonText: '确定',
                });
            }
//延迟之用,可不用
            this.fullscreenLoading = true;
                    setTimeout(() => {
                        this.fullscreenLoading = false;
                        if(this.LoadingFlag === false){
                        //   this.$message({
                        //     message: '服务端无响应,请检查网络或服务器!',
                        //     type: 'warning'
                        //   });
                            this.LoadingFlag = false;
                        }
            }, 5000);
            
         },

附加:sleep方法,类似java的用法,js自己写一个

sleep(ms) {
            var unixtime_ms = new Date().getTime();
            while(new Date().getTime() < unixtime_ms + ms) {}
        },

使用方法就是this.sleep(3000)//3秒延迟