资讯专栏INFORMATION COLUMN

从零开始使用node读取txt处理后导出excel

frank_fun / 2222人阅读

摘要:安装执行版本号,例如以下语句可以安装几的版本好像在墙内只能找到以前的版本使用可以查看现有的版本,可以支持模糊切换。

一直说要好好学习,总结知识什么的。一直觉得没有时间。周一终于提交了论文盲审。决定从今天每周都总结一次自己的所学。希望自己能坚持。

任务描述:

一个医学系的同学要分析一个叫TCGA的数据库,每个实验文件是txt,格式如下:

hsa-miR-1228* 5.185500096 hsa-miR-1229 5.754380131
hsa-miR-1231 4.542420238 hsa-miR-1233 5.148618769
hsa-miR-1234 5.581203559

需要提取出几个指标的对应数据,指标需要她自己输入,根据文件名中的基因名称来排序生成一个excel表格,大约如下:

实现代码:

第一次写的不好,如果看了觉得可以改进请帮忙提出,谢谢。
https://github.com/LuyaoWang/...

实现过程:

这个任务我能想到的方案有:
1.配一个vs环境然后用C#做一个exe执行程序。但是对方有两台电脑,操作系统分别为mac和windows,所以就放弃了。
2.直接写shell脚本,可以处理txt和cvs。但是我不太确定,而且cvs还要转一层。
3.帮助对方配一个node环境,然后用node写个脚本运行一下。

因为我没用过node写脚本,所以就打算试一试,如果有更好的方案可以后续讨论。

1.安装nodejs

如果是帮不会代码的人装环境最好是直接去node官网下个对应版本就了了。不然折腾起来麻烦,地址如下:

https://nodejs.org/en/download/

如果涉及后续的开发,建议先下载nvm(node version manager),再装node。

安装nvm

在终端运行以下语句,里面的版本号看一下:

curl -o https://raw.githubusercontent.com/creationix/nvm/v0.25.2/install.sh | bash

我帮同学配的时候一直报错,说profile not found. Tried (as defined in $PROFILE),所以建议如果没有这个文件的话,先用以下语句建一个文件以后再运行

touch ~/.bash_profile

如果装完输入nvm还是找不到就把以下文字输入.bash_profile,出错提示里面也有的。

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

安装node
执行nvm install + 版本号,例如以下语句可以安装node7.几的版本(好像在墙内只能找到3.3.1以前的版本)

nvm install 7

使用nvm ls可以查看现有的node版本,nvm use 7 可以支持模糊切换。

安装依赖库

在node中已经包含了npm,node project manager吧。所以,我写了一个package.json文件,说明了这个脚本需要依赖的excel库,用npm install来自动安装。

2.node中读取txt

在我现在的理解下,我觉得node只是一个平台,里面有很多的api和库可以用来调用,真正开发的语言还是JavaScript,之后如果有更多理解会修改。所以我就查了一下node已经集合了一个名为fs的库用于处理txt。

主要用到两个api,readfile用来读文件,readdir用于读文件夹。
api文档地址:
https://nodejs.org/api/fs.htm...

建立一个文件app.js,然后把一下代码复制进去,在命令行输入node app.js就可以得到读取的txt文件内容了。

var fs = require("fs");
fs.readFile("txt文件地址", "utf-8", function(error, config) {
    if (error) {
        console.log(error);
        console.log("config文件读入出错");
    }
    console.log(config.toString());
}
3.node中的正则表达式提取文字

这个需要用户输入提取的那个数据名词,然后我把数据名词后面的数字提取出来。这个交互,我使用的是让她填写一个config.txt,然后我解析一下提取出名词,按照正则表达式来匹配,一个名词一重循环(这里可以考虑排序名词,二分查找改进效率)。

正则匹配函数match()
原型:stringObj.match(regExp)
可以有两种使用方式,一种是写死匹配stringObj.match(/ffffd/),一种是传入一个string,然后生成一个RegExp变量,如下:

var itemName = [];
itemName[0] = "hsa-miR-424";
var itemReg  = [];
itemReg[0]  = new RegExp(itemName[0]);itemName存有名词
data.match(itemReg[0]);

具体参看mdn里面有正则表达的详细过滤规则:
https://developer.mozilla.org...

4.node中导出excel

这个我主要参考了small2写的node.js读写excel文件。引入了库excel-export用于导出excel。基本上就是改了一下他的exports.write函数,加入了我需要导入的逻辑,因为我的首行各单元格内容是用户输入的,所以就是还要复制新的caption。并且有的时候需要合并另一个excel里面的cd274的值。

conf是所有需要导入excel的配置和数据。先把这个conf里面的所有数值填写好。包括conf.name就是工作表名称,conf.cols中存放首行单元格信息。conf.rows就是之后每一行的信息。

然后调用var result = excelPort.execute(conf),得到用于写入的二进制数据。

最后调用fs.writeFile(filePath, result, "binary", call_back)写入excel。

另外有个问题,我发现type如果是number的时候我的excel打不开,不知道为什么。

var excelPort = require("excel-export");

exports.write = function(req, res) {
    //   console.log(itemName);
    var conf  = {};
    conf.name = "mysheet";
    conf.cols = [
        {caption: "gene_id", type: "string", width: 40}
    ];
    for (let i = 0; i < itemNum; i++) {
        if (isCD274.match(/y/)) {
            conf.cols[i + 2]         = {caption: "", type: "string", width: 40};
            conf.cols[i + 2].caption = itemName[i];
        } else {
            conf.cols[i + 1]         = {caption: "", type: "string", width: 40};
            conf.cols[i + 1].caption = itemName[i];
        }
    }
    if (isCD274.match(/y/)) {
        conf.cols[1] = {caption: "cd274", type: "string", width: 40};
    }
    conf.rows    = req;
    var result   = excelPort.execute(conf);
    var filePath = "./result.xlsx";
    fs.writeFile(filePath, result, "binary", function(err) {
        if (err) {
            console.log(err);
        }
        console.log("success!");
    });

};

官方文档在此,但是例子用了express,我就没仔细看。
https://www.npmjs.com/package...

总结

第一次正经的自己装了一个node,然后花了一天时间实现了这个功能,还是很开心的。但是由于后来没什么耐心了,各种实现应该不太符合规范。等学习一段时间我再来改进。

这应该是我第一次用js做了脚本操作,之前基本就是最简单的dom操作。我的思维还是停留在c++的那种同步模式,本来想直接用同步机制,但是这样用js的好处就体会不到了。作用域的问题也特别乱,我感觉我一直在不停的把变量嵌套进回调函数。回调嵌套回调,我只知道如何输入一个数据到函数里,不知道怎么输出,只能无限循环进去,我看了一下express可以有req和res的交互,但是不想给一个这么小的例子加太多东西,所以就先这样。我觉得js本身应该解决了这个问题,只是我还没学到,下周研究一下这个问题,把作用域搞搞清楚。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82483.html

相关文章

  • 从零开始的webpack生活-0x009:FilesLoader装载文件

    摘要:修改配置文件匹配的文件名,这里匹配后缀为的,只要了该文件名结尾的文件,都将使用这个来处理命中后使用的加载器查看结果,和之前一致,推荐使用配置文件形式,可以保持引入文件格式的一致性。有利于维护和美观更多配置,可以查阅关于部分。 0x001 概述 上一章讲的是DLL加速编译,这一章开始讲loader相关的部分,但是关于plugin的部分善未完结,因为即将要讲的ExtractTextWebp...

    NervosNetwork 评论0 收藏0
  • 前端js实现字符串/图片/excel文件下载

    摘要:实现并发请求实现并发请求生成并下载字符串文件首先我们需要了解一个特殊的数据格式。如果类型未知,则该值为空字符串。表示状态的数字。一旦完成,属性中将包含一个字符串以表示所读取的文件内容。 在web开发中,如果你想让用户下载或者导出一个文件,应该怎么做呢?传统的做法是在后端存储或者即时生成一个文件来提供下载功能,这样的优势是可以做权限控制、数据二次处理,但缺点是需要额外发起请求、增大服务端...

    DevWiki 评论0 收藏0
  • 前端js实现字符串/图片/excel文件下载

    摘要:实现并发请求实现并发请求生成并下载字符串文件首先我们需要了解一个特殊的数据格式。如果类型未知,则该值为空字符串。表示状态的数字。一旦完成,属性中将包含一个字符串以表示所读取的文件内容。 在web开发中,如果你想让用户下载或者导出一个文件,应该怎么做呢?传统的做法是在后端存储或者即时生成一个文件来提供下载功能,这样的优势是可以做权限控制、数据二次处理,但缺点是需要额外发起请求、增大服务端...

    ingood 评论0 收藏0
  • json转换Excel

    纯JS将json数据转成Excel并导出 采用JS-XLSX这个简单的Javascript库来读取和写入Excel表格文件,并且能够支持最新版本的XLSX文件 一、node 环境 安装XLSX库 1、with npm $ npm install xlsx 2、node 读取文件 if(typeof require !== undefuned) var XLSX = requ...

    KnewOne 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<