成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從零開(kāi)始使用node讀取txt處理后導(dǎo)出excel

frank_fun / 2240人閱讀

摘要:安裝執(zhí)行版本號(hào),例如以下語(yǔ)句可以安裝幾的版本好像在墻內(nèi)只能找到以前的版本使用可以查看現(xiàn)有的版本,可以支持模糊切換。

一直說(shuō)要好好學(xué)習(xí),總結(jié)知識(shí)什么的。一直覺(jué)得沒(méi)有時(shí)間。周一終于提交了論文盲審。決定從今天每周都總結(jié)一次自己的所學(xué)。希望自己能堅(jiān)持。

任務(wù)描述:

一個(gè)醫(yī)學(xué)系的同學(xué)要分析一個(gè)叫TCGA的數(shù)據(jù)庫(kù),每個(gè)實(shí)驗(yàn)文件是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

需要提取出幾個(gè)指標(biāo)的對(duì)應(yīng)數(shù)據(jù),指標(biāo)需要她自己輸入,根據(jù)文件名中的基因名稱來(lái)排序生成一個(gè)excel表格,大約如下:

實(shí)現(xiàn)代碼:

第一次寫(xiě)的不好,如果看了覺(jué)得可以改進(jìn)請(qǐng)幫忙提出,謝謝。
https://github.com/LuyaoWang/...

實(shí)現(xiàn)過(guò)程:

這個(gè)任務(wù)我能想到的方案有:
1.配一個(gè)vs環(huán)境然后用C#做一個(gè)exe執(zhí)行程序。但是對(duì)方有兩臺(tái)電腦,操作系統(tǒng)分別為mac和windows,所以就放棄了。
2.直接寫(xiě)shell腳本,可以處理txt和cvs。但是我不太確定,而且cvs還要轉(zhuǎn)一層。
3.幫助對(duì)方配一個(gè)node環(huán)境,然后用node寫(xiě)個(gè)腳本運(yùn)行一下。

因?yàn)槲覜](méi)用過(guò)node寫(xiě)腳本,所以就打算試一試,如果有更好的方案可以后續(xù)討論。

1.安裝nodejs

如果是幫不會(huì)代碼的人裝環(huán)境最好是直接去node官網(wǎng)下個(gè)對(duì)應(yīng)版本就了了。不然折騰起來(lái)麻煩,地址如下:

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

如果涉及后續(xù)的開(kāi)發(fā),建議先下載nvm(node version manager),再裝node。

安裝nvm

在終端運(yùn)行以下語(yǔ)句,里面的版本號(hào)看一下:

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

我?guī)屯瑢W(xué)配的時(shí)候一直報(bào)錯(cuò),說(shuō)profile not found. Tried (as defined in $PROFILE),所以建議如果沒(méi)有這個(gè)文件的話,先用以下語(yǔ)句建一個(gè)文件以后再運(yùn)行

touch ~/.bash_profile

如果裝完輸入nvm還是找不到就把以下文字輸入.bash_profile,出錯(cuò)提示里面也有的。

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

安裝node
執(zhí)行nvm install + 版本號(hào),例如以下語(yǔ)句可以安裝node7.幾的版本(好像在墻內(nèi)只能找到3.3.1以前的版本)

nvm install 7

使用nvm ls可以查看現(xiàn)有的node版本,nvm use 7 可以支持模糊切換。

安裝依賴庫(kù)

在node中已經(jīng)包含了npm,node project manager吧。所以,我寫(xiě)了一個(gè)package.json文件,說(shuō)明了這個(gè)腳本需要依賴的excel庫(kù),用npm install來(lái)自動(dòng)安裝。

2.node中讀取txt

在我現(xiàn)在的理解下,我覺(jué)得node只是一個(gè)平臺(tái),里面有很多的api和庫(kù)可以用來(lái)調(diào)用,真正開(kāi)發(fā)的語(yǔ)言還是JavaScript,之后如果有更多理解會(huì)修改。所以我就查了一下node已經(jīng)集合了一個(gè)名為fs的庫(kù)用于處理txt。

主要用到兩個(gè)api,readfile用來(lái)讀文件,readdir用于讀文件夾。
api文檔地址:
https://nodejs.org/api/fs.htm...

建立一個(gè)文件app.js,然后把一下代碼復(fù)制進(jìn)去,在命令行輸入node app.js就可以得到讀取的txt文件內(nèi)容了。

var fs = require("fs");
fs.readFile("txt文件地址", "utf-8", function(error, config) {
    if (error) {
        console.log(error);
        console.log("config文件讀入出錯(cuò)");
    }
    console.log(config.toString());
}
3.node中的正則表達(dá)式提取文字

這個(gè)需要用戶輸入提取的那個(gè)數(shù)據(jù)名詞,然后我把數(shù)據(jù)名詞后面的數(shù)字提取出來(lái)。這個(gè)交互,我使用的是讓她填寫(xiě)一個(gè)config.txt,然后我解析一下提取出名詞,按照正則表達(dá)式來(lái)匹配,一個(gè)名詞一重循環(huán)(這里可以考慮排序名詞,二分查找改進(jìn)效率)。

正則匹配函數(shù)match()
原型:stringObj.match(regExp)
可以有兩種使用方式,一種是寫(xiě)死匹配stringObj.match(/ffffd/),一種是傳入一個(gè)string,然后生成一個(gè)RegExp變量,如下:

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

具體參看mdn里面有正則表達(dá)的詳細(xì)過(guò)濾規(guī)則:
https://developer.mozilla.org...

4.node中導(dǎo)出excel

這個(gè)我主要參考了small2寫(xiě)的node.js讀寫(xiě)excel文件。引入了庫(kù)excel-export用于導(dǎo)出excel。基本上就是改了一下他的exports.write函數(shù),加入了我需要導(dǎo)入的邏輯,因?yàn)槲业氖仔懈鲉卧駜?nèi)容是用戶輸入的,所以就是還要復(fù)制新的caption。并且有的時(shí)候需要合并另一個(gè)excel里面的cd274的值。

conf是所有需要導(dǎo)入excel的配置和數(shù)據(jù)。先把這個(gè)conf里面的所有數(shù)值填寫(xiě)好。包括conf.name就是工作表名稱,conf.cols中存放首行單元格信息。conf.rows就是之后每一行的信息。

然后調(diào)用var result = excelPort.execute(conf),得到用于寫(xiě)入的二進(jìn)制數(shù)據(jù)。

最后調(diào)用fs.writeFile(filePath, result, "binary", call_back)寫(xiě)入excel。

另外有個(gè)問(wèn)題,我發(fā)現(xiàn)type如果是number的時(shí)候我的excel打不開(kāi),不知道為什么。

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,我就沒(méi)仔細(xì)看。
https://www.npmjs.com/package...

總結(jié)

第一次正經(jīng)的自己裝了一個(gè)node,然后花了一天時(shí)間實(shí)現(xiàn)了這個(gè)功能,還是很開(kāi)心的。但是由于后來(lái)沒(méi)什么耐心了,各種實(shí)現(xiàn)應(yīng)該不太符合規(guī)范。等學(xué)習(xí)一段時(shí)間我再來(lái)改進(jìn)。

這應(yīng)該是我第一次用js做了腳本操作,之前基本就是最簡(jiǎn)單的dom操作。我的思維還是停留在c++的那種同步模式,本來(lái)想直接用同步機(jī)制,但是這樣用js的好處就體會(huì)不到了。作用域的問(wèn)題也特別亂,我感覺(jué)我一直在不停的把變量嵌套進(jìn)回調(diào)函數(shù)。回調(diào)嵌套回調(diào),我只知道如何輸入一個(gè)數(shù)據(jù)到函數(shù)里,不知道怎么輸出,只能無(wú)限循環(huán)進(jìn)去,我看了一下express可以有req和res的交互,但是不想給一個(gè)這么小的例子加太多東西,所以就先這樣。我覺(jué)得js本身應(yīng)該解決了這個(gè)問(wèn)題,只是我還沒(méi)學(xué)到,下周研究一下這個(gè)問(wèn)題,把作用域搞搞清楚。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82483.html

相關(guān)文章

  • 從零開(kāi)始的webpack生活-0x009:FilesLoader裝載文件

    摘要:修改配置文件匹配的文件名,這里匹配后綴為的,只要了該文件名結(jié)尾的文件,都將使用這個(gè)來(lái)處理命中后使用的加載器查看結(jié)果,和之前一致,推薦使用配置文件形式,可以保持引入文件格式的一致性。有利于維護(hù)和美觀更多配置,可以查閱關(guān)于部分。 0x001 概述 上一章講的是DLL加速編譯,這一章開(kāi)始講loader相關(guān)的部分,但是關(guān)于plugin的部分善未完結(jié),因?yàn)榧磳⒁v的ExtractTextWebp...

    NervosNetwork 評(píng)論0 收藏0
  • 前端js實(shí)現(xiàn)字符串/圖片/excel文件下載

    摘要:實(shí)現(xiàn)并發(fā)請(qǐng)求實(shí)現(xiàn)并發(fā)請(qǐng)求生成并下載字符串文件首先我們需要了解一個(gè)特殊的數(shù)據(jù)格式。如果類型未知,則該值為空字符串。表示狀態(tài)的數(shù)字。一旦完成,屬性中將包含一個(gè)字符串以表示所讀取的文件內(nèi)容。 在web開(kāi)發(fā)中,如果你想讓用戶下載或者導(dǎo)出一個(gè)文件,應(yīng)該怎么做呢?傳統(tǒng)的做法是在后端存儲(chǔ)或者即時(shí)生成一個(gè)文件來(lái)提供下載功能,這樣的優(yōu)勢(shì)是可以做權(quán)限控制、數(shù)據(jù)二次處理,但缺點(diǎn)是需要額外發(fā)起請(qǐng)求、增大服務(wù)端...

    DevWiki 評(píng)論0 收藏0
  • 前端js實(shí)現(xiàn)字符串/圖片/excel文件下載

    摘要:實(shí)現(xiàn)并發(fā)請(qǐng)求實(shí)現(xiàn)并發(fā)請(qǐng)求生成并下載字符串文件首先我們需要了解一個(gè)特殊的數(shù)據(jù)格式。如果類型未知,則該值為空字符串。表示狀態(tài)的數(shù)字。一旦完成,屬性中將包含一個(gè)字符串以表示所讀取的文件內(nèi)容。 在web開(kāi)發(fā)中,如果你想讓用戶下載或者導(dǎo)出一個(gè)文件,應(yīng)該怎么做呢?傳統(tǒng)的做法是在后端存儲(chǔ)或者即時(shí)生成一個(gè)文件來(lái)提供下載功能,這樣的優(yōu)勢(shì)是可以做權(quán)限控制、數(shù)據(jù)二次處理,但缺點(diǎn)是需要額外發(fā)起請(qǐng)求、增大服務(wù)端...

    ingood 評(píng)論0 收藏0
  • json轉(zhuǎn)換Excel

    純JS將json數(shù)據(jù)轉(zhuǎn)成Excel并導(dǎo)出 采用JS-XLSX這個(gè)簡(jiǎn)單的Javascript庫(kù)來(lái)讀取和寫(xiě)入Excel表格文件,并且能夠支持最新版本的XLSX文件 一、node 環(huán)境 安裝XLSX庫(kù) 1、with npm $ npm install xlsx 2、node 讀取文件 if(typeof require !== undefuned) var XLSX = requ...

    KnewOne 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<