Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


9 questions online user: 8

12
votes
answers
30 views
+10

JavaScript地图和查找同时:findMap?

如果不使用for循环,如何重写它?

  const a = [2,5,78,4]; const expensiveFunction = n => 2 * n; 结果; //找到第一个数字(let i = 0; i< a.length; i ++){const r = expensiveFunction(a [i]); if(r> 100){result = r; 打破; console.log(result);   

我天真的方法:

  const result = a.map(expensiveFunction).find(x => x> 100); 的console.log(结果);   

但是这会在所有元素上运行 expensiveFunction ,我想避免这些。在上面的例子中,我们应该避免运行 expensiveFunction(4)

有些语言有

沙发
+50
+50

内置 map 是贪婪的,所以你必须编写自己的懒人版本:

  const a = [2,5,78,4]; const expensiveFunction = n => {console.log('expensiveFunction for',n); 返回2 * n}; function * map(a,fn){for(let x of a)yield fn(x); 函数find(a,fn){for(let x of a)if(fn(x))返回x; } r = find(map(a,expensiveFunction),x => x> 100)console.log('result',r)    

与stock map 不同,此 map 是一个生成器,可根据需要返回(产生)结果,而不是一次处理整个数组。此示例中的 find map 是“coroutines”并播放某种乒乓游戏,其中 find 请求结果和地图在被问到时提供它们。一旦 find 对它得到的东西感到满意,它就会退出, map 也会退出,因为没有人再要求它的结果了。

你可以还要将 map find 和朋友添加到 IteratorPrototype 使它们可用于所有迭代器并能够使用点表示法:

  const IteratorPrototype = Object.getPrototypeOf( Object.getPrototypeOf([] [Symbol.iterator]())); Object.defineProperties(IteratorPrototype,{map:{value:function *(fn){for(let x of this){yield fn(x);}},enumerable:false},find:{value:function(fn){ for(let x of this){if(fn(x))return x;}},enumerable:false},}); // const a = [2,5,78,4]; const expensiveFunction = n => {console.log('expensiveFunction',n); 返回2 * n}; 设r = a.values()。map(expensiveFunction).find(x => x> 100); console.log(r)    

实际上,我非常喜欢这个想法,即基于它编写了一个完整的库: https://github.com/gebrkn/armita

我现在最喜欢的答案。 - 昨天的amaurymartiny

@amaurymartiny然后接受它... - 昨天的FZs

这里有如此多的知识,+ 1。1 - Code Maniac昨天

@FZs是的。我还在等待其他命题。 - 昨天的amaurymartiny

@CodeManiac:添加了一些解释 - 昨天乔治

+30

像这样的东西

  const a = [2,5,78,4]; const expensiveFunction = n => 2 * n; 让findMap = arr => {let found = arr.find(a => expensiveFunction(a)> 100)返回发现!== undefined?expensiveFunction(found):found} console.log(findMap(a));     

提醒: - 出于好奇,但hacky或者你可以称之为误用 find

2 * n; 让findMap = arr => {let returnValue; let found = arr.find(a => {returnValue = expensiveFunction(a)return returnValue> 100})return returnValue} console.log(findMap(a)); 2 * n; 让findMap = arr => {let returnValue; let found = arr.find(a => {returnValue = expensiveFunction(a)return returnValue> 100})return returnValue} console.log(findMap(a));

不,最终结果应该是昂贵的功能(78),即156. - amaurymartiny昨天

@amaurymartiny再次将发现的值再次传递给昂贵的功能 - 昨天Code Maniac

昂贵的功能是昂贵的,我不想运行它两次。 - 昨天的amaurymartiny

@amaurymartiny据我所知,比你发布的代码最优化,让我想想如果我能拿出别的东西 - Code Maniac昨天

@amaurymartiny刚刚添加了一个hacky版本,你可以称之为滥用find,但仅仅是出于好奇 - 昨天Code Maniac

+20

如果您愿意接受修改数组中的第一个匹配元素,则可以执行以下操作:

  a [a.findIndex((value,index)=> { value = expensiveFunction(value); return(值> 100&&(a [index] = value))})] //返回156   

否则,你需要使用占位符变量来使其工作 - 很可能使for循环成为最干净的选项。

+10

您可以使用 .reduce ,唯一的缺点是一旦找到值就无法停止,但您不必为每个值运行 expensiveFunction 这是一个例子:

  const a = [2,5, 78,4]; const expensiveFunction = n => 2 * n; const result = a.reduce((acc,cur)=> {if(!acc){const r = expensiveFunction(cur); if(r> 100){acc = r;}} return acc;},null ); 的console.log(结果);  

     
			
        
+10

您可以通过使用三元运算符来简化条件并使用filter()来删除数组的布尔(null)值。

  const a = [2,5,78,100]; const result = a.map((n)=> 2 * n> 100?2 * n:null).filter(Boolean)[0]; console.log(result);    

     
			
        
0

为什么不使用更智能的功能进行查找?

  let desiredValue; const result = a.find(x => {desiredValue = expensiveFunction(x); return desiredValue> 100;}); log(desiredValue);   

在找到第一个结果后,它会立即退出昂贵的循环。

是,但结果将是x而不是expensiveFunction(x)的返回值。 - 提图斯昨天

如果您不想再次调用昂贵的功能,请参阅更新 - vantrung -cuncon昨天

在dba.stackexchange.com上搜索它已经多次回答了。 - Sudipta Mondal 8月29日5:11

0

我遵循的方法是尽可能减少调用'expensiveFunction'函数的可能性。为此,我使用了“划分和征服算法”。您将数组分成一半,并在分割元素上调用昂贵的函数来决定继续进行哪一半。递归执行此步骤,直到找到100以上的最小元素。特别是对于非常大的数组,此方法会将昂贵的函数调用减少到显着更小的数字。因此'expensiveFunCaller'功能将在经济上称为'昂贵的功能'。该数组也应该先排序。

  const a = [2,5,78,80] .sort((a,b)=> ab); const expensiveFunction = n => 2 * n; const expensiveFunCaller =([... arr])=> {if(arr.length< 2){let r = expensiveFunction(arr [0]); if(r> 100)返回r; 返回; } else if(arr.length === 2){let r = expensiveFunction(arr [0]); if(r> 100)返回r; r = expensiveFunction(arr [1]); if(r> 100)返回r; 返回; } let idx = Math.floor(arr.length / 2); 令r = expensiveFunction(arr [idx]); return(r< 100)?expensiveFunCaller(arr.slice(idx + 1,arr.length)):expensiveFunCaller(arr.slice(0,idx + 1)); } console.log(expensiveFunCaller(a));   r = expensiveFunction(arr [1]); if(r> 100)返回r; 返回; } let idx = Math.floor(arr.length / 2); 令r = expensiveFunction(arr [idx]); return(r< 100)?expensiveFunCaller(arr.slice(idx + 1,arr.length)):expensiveFunCaller(arr.slice(0,idx + 1)); } console.log(expensiveFunCaller(a));   r = expensiveFunction(arr [1]); if(r> 100)返回r; 返回; } let idx = Math.floor(arr.length / 2); 令r = expensiveFunction(arr [idx]); return(r< 100)?expensiveFunCaller(arr.slice(idx + 1,arr.length)):expensiveFunCaller(arr.slice(0,idx + 1)); } console.log(expensiveFunCaller(a));  
     
			
        

不会对[2,3,78,80]起作用。预计:昂贵的功能(78)。实际:昂贵的功能(80) - 昨天的amaurymartiny

@amaurymartiny我想他想把这个函数应用于数组中最大的数字。他对78有什么特别的兴趣? - 昨天的亚的斯亚贝巴

我想找到数组中的第一个元素,其值由expensiveFunction> 100. - amaurymartiny昨天

@amaurymartiny现在非常清楚,我会尝试编辑它。 - 昨天的亚的斯亚贝巴

0
votes
answers
113 views
+10

我怎樣才能解析csv數據從一個字符串的JavaScript數組中使用d3圖

0

我想使用字符串的JavaScript數組中的數據產生一個D3圖形,顯示時間戳記的時間序列(t),接收( rx)和發送(tx)計數器。數組中的每個成員都是一個對應於一行時間的字符串,rx,tx(是的,帶有逗號分隔符)。我不想使用基於d3.request的方法。我已經使用服務器端lua代碼從服務器讀取文件,並使用jslines.push(字符串)將數據放入頁面。我怎樣才能解析csv數據從一個字符串的JavaScript數組中使用d3圖

109 // Show results so far 
110 for (i=0; i < jslines.length; i++) { 
111  console.log(i + ": " + jslines[i]); 
112 } 

上面的部分給我的信心數據是我所描述的。現在我只是試圖從「行」中取出3個數據值中的每一個,然後重複。我不在乎他們在這一點上仍然是字符串。數字後面。

我的參考資料是:https://github.com/d3/d3-dsv/blob/master/README.md#csvParseRows但我明顯誤解了所需的工作。

114 var dataArray = d3.csvParseRows(jslines, function(d, i) { 
115 return { 
116  time: d[0], 
117  rx: d[1], 
118  tx: d[2] 
119 }; 
120 }); 

將感謝(種類)的建議和/或使用D3解析的工作示例和d3被本身不是從遠程(或本地)文件中提取準備數據。我能找到的大多數例子都是要求d3將文件內容傳輸到客戶端,我相信。

謝謝...艾倫

+1

請分享'jslines'數組(不是全部,只是一些元素就夠了)。請記住,'d3.csvParseRows'將解析一個字符串,而不是一個數組。另外,請詳細解釋*什麼*在代碼中不起作用......你是否按照你想要的方式獲得了'dataArray'?或者這裏的問題是如何使用'dataArray'? –

+0

jslines數組的每個成員都包含一個字符串,其內容如下:「1234567,100,110」,已經用空格修飾,值之間用單個逗號。所有的值都應該是非負的。用我最初粘貼的代碼,dataArray出來nil。 –

+0

那麼,沒有換行符?你不能在'd3.csvParseRows'中使用它:函數怎麼知道它正在處理哪一行? –

沙发
0
1

如果你已經有了字符串,你可以把它分解如下:

var a = "1,2,3" 
var b = a.split(",") 
console.log(b[1]) 

具體而言,你的榜樣,您可以提取數據是這樣的:

var data = jslines.map(function(l) { 
    data = l.split(","); 
    return({time: data[0], rx: data[1], tx: data[2]}); 
}) 

然後根據得到的對象數組構造你的d3圖。

+0

謝謝埃裏克。我遵循你的例子,除了我把函數內的變量「data」改爲「tempdata」(在兩個縮進行上),以保證函數內的數據(現在是tempdata)與外部數據不同。沒有必要,但有助於我的理解。謝謝! –

0
votes
answers
102 views
+10

Lua代碼解釋(與RNN相關)

-1

我想了解JcJohnson/Karpathy的代碼用於在Lua和Torch中編寫的RNN的一部分。如果你好奇,你可以在github上找到完整的項目。Lua代碼解釋(與RNN相關)

https://github.com/jcjohnson/torch-rnn

我需要幫助的部分低於其從LanguageModel.lua文件:

if #start_text > 0 then 
    if verbose > 0 then 
     print('Seeding with: "' .. start_text .. '"') 
    end 
    local x = self:encode_string(start_text):view(1, -1) 
    local T0 = x:size(2) 
    sampled[{{}, {1, T0}}]:copy(x) 
    scores = self:forward(x)[{{}, {T0, T0}}] 
    first_t = T0 + 1 
else 

例如,我不知道這些意味着什麼。

:view((1, -1) 
:size(2) 
:copy(x) 
sampled[] 

您知道這些是什麼或表示我能找到他們的參考?

謝謝

+0

閱讀盧阿本身第一語言規範? – hjpotter92

沙发
0
0

你可能需要一些火炬教程here或檢查火炬的文檔在github repo

+0

嗨陳,這些幫助很大,謝謝。只有一行我現在無法弄清楚這一點:scores = self:forward(x)[{{},{T0,T0}}],任何想法[]括號包含什麼?我瞭解自我:向前(x),但爲什麼之後的額外項目,他們是什麼意思? – Brajesh

+0

'self:forward(x)'返回一個新的張量,括號[]是索引操作符以選擇新張量中的元素。你可以看到更多的索引操作符[這裏](https://github.com/torch/torch7/blob/master/doc/tensor.md#tensor--dim1dim2--或--dim1sdim1e-dim2sdim2e-)。 – Chen

+0

謝謝陳! – Brajesh

0
votes
answers
103 views
+10

如何在Alpine linux上添加用於nginx的Lua模塊?

0

我想在啓用Lua模塊的情況下爲nginx提供精簡的Docker鏡像。我如何基於Alpine linux創建這個?如何在Alpine linux上添加用於nginx的Lua模塊?

沙发
0
-1

你看看在泊塢樞紐

https://hub.docker.com/

,你會發現Nginx上圖像的基礎上,高山Linux的,和Lua支持

一些例子

https://hub.docker.com/r/ilagnev/alpine-nginx-lua/

https://hub.docker.com/r/firesh/nginx-lua/

看一看的Dockerfile更多細節

+0

我發現這兩個,但發現沒有兩個是最新(最後推一年前)。另外,他們缺乏關於如何啓用模塊的信息。 – Marian

+0

這個文檔是否正確? https://github.com/openresty/lua-nginx-module#installation – user2915097

板凳
0
1

這裏是一個Dockerfile

FROM alpine:3.6 

RUN apk add --no-cache nginx-mod-http-lua 

# Delete default config 
RUN rm -r /etc/nginx/conf.d && rm /etc/nginx/nginx.conf 

# Create folder for PID file 
RUN mkdir -p /run/nginx 

# Add our nginx conf 
COPY ./nginx.conf /etc/nginx/nginx.conf 

CMD ["nginx"] 

安裝nginx-mod-http-lua包也將安裝nginxluajit,等等。

nginx.conf至少應包含這樣的:

load_module /usr/lib/nginx/modules/ndk_http_module.so; 
load_module /usr/lib/nginx/modules/ngx_http_lua_module.so; 

pcre_jit on; 

events { 
    worker_connections 1024; 
} 

daemon off; 
+0

如果你沒有從默認的[nginx中刪除include/etc/nginx/modules/*。conf;'這些'load_module'的.conf](https://github.com/alpinelinux/aports/blob/954391ce7493439d12180d5c5118dee26f8ac587/main/nginx/nginx.conf#L15)。 –

+0

@Marian:我們如何在這種情況下安裝luarocks?我確實找到了luajit的包含路徑。 – Raeesaa

0
votes
answers
85 views
+10

測試如果一個變量有數字或字母或兩者/無LUA

-2

進出口試圖找出如何在Lua檢查一個字符串變量中有任何字母或數字,像這樣:測試如果一個變量有數字或字母或兩者/無LUA

myAwesomeVar = "hi there crazicrafter1" 

if myAwesomeVar(has letters and numbers) then 
    print("It has letters and numbers!") 
elseif myAwesomeVar(has letters and not numbers) then 
    print("It has letters!, but no numbers...") 
elseif myAwesomeVar(has not letters and not numbers) then 
    print("It doesnt have letters or numbers...") 
elseif myAwesomeVar(has not letters and numbers) then 
    print("It doesnt have letters, but it has numbers!") 
end 

我知道這是不正確的一些論點,但這是我的目標是我的代碼輸出:

它有字母和數字!

+1

通常的方法是寫兩個函數'函數has_letters(STR)'和'功能has_numbers(STR)'每個返回布爾 –

沙发
0
0

正如葉戈爾認爲你會寫檢查,如果字符串包含任何數字或字母的任何一個功能...

的Lua提供了方便的字符串分析字符串模式。

function containsDigit(str) 

    return string.find(str, "%d") and true or false 

end 

我敢打賭,你可以對信件做同樣的事情。請參閱Lua 5.3 Reference Manual 6.4.1: String patterns

的,你可以這樣做

local myString = "hello123" 
if containsDigit(myString) and containsDigit(myString) then 
    print("contains both") 
end 
0
votes
answers
83 views
+10

從另一個線程(lua)產生線程

0

我想爲Lua創建一個睡眠函數,因爲我的Lua腳本全部運行在不同的線程/環境中,所以我想讓它們的線程產生並從主線程重新啓動,給定的時間已過去,主線程在Java中,並且時間流逝通過循環完成。從另一個線程(lua)產生線程

現在這不是很難或什麼,但我想使用Lua自己的協程/線程,所以我不必創建自己的線程結構,但(我的Lua知識不是頂尖的)我不喜歡我不知道如何從線外產生線。

是否有可能從主線程產生線程?

編輯沒關係,我只是想通了。我做了一個getfenv,並使用它自己的環境腳本的coroutine.yield。

+0

如果你找到答案,也許你可以回答自己的問題,幫助將來會提出同樣問題的用戶。 – jpjacobs

+0

我解釋了我在編輯中做了什麼。 – Tim

+0

最好真的回答它(即使你只是複製粘貼也沒關係)。否則你的問題一直沒有答案。另見[這裏](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) – jpjacobs

沙发
0
1

我用它的coroutine.yield函數的腳本。很容易回頭看看它

0
votes
answers
84 views
+10

在Windows中使用lua os.execute啓動一個沒有CMD閃存的程序

8

我很高興在Lua的windows系統中使用xzxx 在Windows中使用lua os.execute啓動一個沒有CMD閃存的程序

strProgram = '"C:\Program Files\Ps Pad\PSPad.exe"' 
strCmd = 'start "" '..strProgram 
os.execute(strCmd) 

啓動程序。這樣可以正常工作,啓動程序和腳本完成。 它如何在命令窗口閃爍幾分之一秒,是否有人從Lua啓動程序。

+0

如果你只是用'strProgram'代替strCmd'的'會發生什麼?換句話說,你真的需要'開始'嗎? – BMitch 2011-06-15 19:04:36

+0

啓動的程序一直運行並且Lua腳本一直掛起直到程序關閉,命令窗口保持打開狀態。 – 2011-06-15 19:52:08

+1

從文檔看,它們看起來像是通過OS shell運行它(對不起,我在Linux上,所以我無法自己測試)。除非有人知道Lua技巧,否則您可能需要使用執行'fork/exec'而不是'system'調用的主機語言(例如C)編寫自己的函數,並將該API導出到Lua。 – BMitch 2011-06-15 20:54:10

沙发
0
7

Lua的os.execute命令是基於C標準庫的「shell」函數。在Windows中,此函數將始終創建一個命令窗口,並且它將始終停止當前進程直到窗口結束。後者也發生在Linux中。

最終沒有辦法解決這個問題。不通過Lua標準API。由於Lua需要輕量級且獨立於平臺,因此不允許使用API??來使用與操作系統相關的本機API。

最好的辦法是使用Lua Ex-Api模塊。這實際上是放棄了,你可能需要修補一些編譯器問題(我猜Windows端口不是他們的首要任務)。但是這是產生進程的合理好方法。您可以選擇等到自己完成,或讓它們平行運行。它不會拋出一個命令提示符窗口,除非應用程序本身使用它。

+0

謝謝你,我恐怕看起來有點超出我的技能範圍,我會將它傳遞給軟件擁有Lua的人,看看他是否可以爲我添加一個函數,如果他將代碼指向他需要它。 – 2011-06-16 16:45:34

+0

我相信至少有一種方法可以在不使用控制檯的情況下使用io.popen在沒有額外庫的情況下彈出窗口來執行命令。請看我的答案。 – 2015-04-15 12:58:31

板凳
0
0

這是一種在沒有控制檯窗口的情況下僅使用Lua標準API(即沒有額外的庫)來運行命令的方式。在Win7 x64上測試。

function exec_silent(command) 
    local p = assert(io.popen(command)) 
    local result = p:read("*all") 
    p:close() 
    return result 
end 

編輯:請參閱下面的評論,它可能不適用於所有人。我不知道爲什麼。

+0

Negative,Win7 64位,它的行爲與只是popen或執行相同(Lua 5.2.3,鏈接) – handle 2015-08-07 15:17:15

+0

@handle然後,我們的設置顯然有些不同。我幾乎每天都在構建系統中使用這些代碼,並且根本沒有命令窗口彈出。 – 2015-08-08 09:31:31

+0

不要懷疑你,只是準備其他人,儘管你的成功,這可能無法正常工作。 – handle 2015-08-10 07:53:25

地板
0
1

這是我用來從Lua調用批處理的一段代碼,可能有幫助。 在贏控制檯(命令提示符)打開並執行,同時在UNIX(MAC |尼克斯)

-- sBatchFile = .bat for windows, .sh for x 
function vfFork2(sBatchFile) 
    local b = package.cpath:match("%p[\|/]?%p(%a+)") 
    if b == "dll" then 
     -- windows 
     os.execute('start cmd /k call "'..sBatchFile..'"') 
    elseif b == "dylib" then 
     -- macos 
     os.execute('chmod +x "'..sBatchFile..'"') 
     os.execute('open -a Terminal.app "'..sBatchFile..'"') 
    elseif b == "so" then 
     -- Linux 
     os.execute('chmod +x "'..sBatchFile..'"') 
     os.execute('xterm -hold -e "'..sBatchFile..'" & ') 
    end 
end 
0
votes
answers
83 views
+10

Lua訪問2D數組內的值

1

看起來這應該是一件簡單的事情。我已將下面的json結構轉換爲lua表,但我無法訪問數組內的值。我一直在瀏覽很多問題和互聯網,而且我沒有嘗試過的例子。Lua訪問2D數組內的值

下面是使用cjson.decode

[{ 
    "user": "user_1", 
    "password": "something", 
    "id": "35", 
    "message": "message 1" 
}, 
{ 
    "user": "user_2", 
    "password": "something", 
    "id": "5c", 
    "message": "message 2" 
}, 
{ 
    "user": "user_3", 
    "password": "something", 
    "id": "7e", 
    "message": "message 3" 
}, 
{ 
    "user": "user_3", 
    "password": "something", 
    "id": "6f", 
    "message": "message 4" 
}] 

然後我嘗試訪問變量這樣轉換爲LUA表的JSON:

ngx.say(users[0]["user"]); 

但是不起作用。我想迭代數組並獲取數組中每個索引處的用戶,密碼,id和消息,但首先我想看看如何訪問index 0處的用戶值,該值應該是user_1。我知道這是一個n00b問題,但任何幫助將不勝感激。

沙发
0
2

默認情況下,Lua表從索引1開始。

+0

是啊,想到這一點,並嘗試ngx.say(用戶[1] [「用戶」]);但仍然沒有快樂 –

+0

@JoelParker它會幫助,如果你會提供一個錯誤消息,而不是僅僅說它不工作;) – Piglet

+0

這是爲lua模塊在nginx,它只是崩潰,沒有錯誤給出 –

2
votes
answers
85 views
+10

在node.js中一次讀取一行文件?

我試圖一次讀取一行大文件。我發現關於Quora的一個問題涉及這個主題,但是我錯過了一些聯繫,以使整個事情融合在一起。

  var Lazy = require(”lazy“) ; new Lazy(process.stdin).lines .forEach(function(line){console.log(line.toString());}); process.stdin.resume();   

我想弄清楚的是我如何從文件而不是STDIN一次讀取一行,如本例所示。

I試過:

  fs.open('./ VeryBigFile.csv','r',' 0666',過程); function process(err,fd){if(err)throw err; // DO lazy read}   

但它不起作用。我知道,在緊要關頭我可以回歸使用像PHP這樣的東西,但我想弄明白這一點。

我認為其他答案不會起作用,因為文件比我正在運行它的服務器大得多。

沙发
+10

我有一個小模塊可以很好地完成這項工作,並且被許多其他項目使用 npm readline 請注意節點v10中有一個原生readline模塊,所以我將我的模塊重新發佈為linebyline https:// www .npmjs.com / package / linebyline

如果您不想使用該模塊,該功能非常簡單:

  var fs = require('fs '),EventEmitter = require('events')。EventEmitter,util = require('util'),newlines = [13,// 10 //]; var readLine = module.exports = function(file,opts){if(!(this instanceof readLine))return new readLine(file); EventEmitter。調用(這); opts = opts || {}; var self = this,line = [],lineCount = 0,emit = function(line,count){self.emit('line',new Buffer(line).toString(),count); }; this.input = fs.createReadStream(file); this.input.on('open',function(fd){self.emit('open',fd);})。on('data',function(data){for(var i = 0; i&lt; data.length; i ++){if(0&lt; = newlines.indexOf(data [i])){//找到換行符.lineCount ++; if(line.length)emit(line,lineCount); line = [] ; //空緩衝區。} else {line.push(data [i]); //緩衝新行數據。}}})。on('error',function(err){self.emit('error',錯誤);})。on('end',function(){//如果因EOF而遺留任何內容,則發出最後一行。如果(行。長度){lineCount ++; emit(line,lineCount); } self.emit('end'); })。on('close',function(){self.emit('close');}); }; util.inherits(readLine,EventEmitter);  
     
			
        
板凳
+10

另一個解決方案是通過順序執行程序 nsynjs 運行邏輯。它使用節點readline模塊逐行讀取文件,並且它不使用promises或遞歸,因此不會在大文件上失敗。以下是代碼的外觀:

  var nsynjs = require('nsynjs'); var textFile = require('./ wrappers / nodeReadline')。textFile; //此文件是nsynjs函數進程(textFile)的一部分{var fh = new textFile(); fh.open('路徑/到/文件'); var s; while(typeof(s = fh.readLine(nsynjsCtx).data)!='undefined')console.log(s); fh.close(); } var ctx = nsynjs.run(process,{},textFile,function(){console.log('done');}); <
     
			
        
地板
0

我用這個:

  function emitLines(stream,re){re = re&amp;&amp; //; var buffer =''; stream.on('data',stream_data); stream.on('end',stream_end); function stream_data(data){buffer + = data; 沖洗(); } // stream_data function stream_end(){if(buffer)stream.emmit('line',buffer); } // stream_end function flush(){var re = / /; var匹配; while(match = re.exec(buffer)){var index = match.index + match [0] .length; stream.emit('line',buffer.substring(0,index)); buffer = buffer.substring(index); re.lastIndex = 0; }} // flush} // emitLines   

4楼
0

雖然您應該使用 readline 模塊,但最佳答案建議, readline 似乎面向命令行界面而不是行讀取。關於緩衝,它也有點不透明。(任何需要面向流式線路讀卡器的人可能都想調整緩衝區大小)。readline模塊大約是1000行,而統計和測試則是34。

  const EventEmitter = require('events')。EventEmitter; class LineReader擴展EventEmitter {constructor(f,delim =''){super(); this.totalChars = 0; this.totalLines = 0; this.leftover =''; f.on('data',(chunk)=&gt; {this.totalChars + = chunk.length; let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; 返回; } lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); this.totalLines + = lines.length; for(let l of lines)this.onLine(l); }); // f.on('error',()=&gt; {}); f.on('end',()=&gt; {console.log('chars',this.totalChars,'lines',this.totalLines)}); } onLine(l){this.emit('line',l); } //命令行測試const f = require('fs')。createReadStream(process.argv [2],'utf8'); const delim = process.argv [3]; const lineReader = new LineReader(f,delim); lineReader.on(“線”,(行)=&GT; 的console.log(線));   

這是一個更短的版本,沒有統計數據,19行:

  class LineReader extends require('events')。EventEmitter {constructor(f) ,delim =''){super(); this.leftover =''; f.on('data',(chunk)=&gt; {let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; return;} lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line', l);}); }}   日誌(線));   

這是一個更短的版本,沒有統計數據,19行:

  class LineReader extends require('events')。EventEmitter {constructor(f) ,delim =''){super(); this.leftover =''; f.on('data',(chunk)=&gt; {let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; return;} lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line', l);}); }}   日誌(線));   

這是一個更短的版本,沒有統計數據,19行:

  class LineReader extends require('events')。EventEmitter {constructor(f) ,delim =''){super(); this.leftover =''; f.on('data',(chunk)=&gt; {let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; return;} lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line', l);}); }}   是一個更短的版本,沒有統計數據,在19行: 
 類LineReader extends require('events')。EventEmitter {constructor(f,delim =''){super(); this.leftover =''; f.on('data',(chunk)=&gt; {let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; return;} lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line', l);}); }}   是一個更短的版本,沒有統計數據,在19行: 
 類LineReader extends require('events')。EventEmitter {constructor(f,delim =''){super(); this.leftover =''; f.on('data',(chunk)=&gt; {let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; return;} lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line', l);}); }}   class LineReader extends require('events')。EventEmitter {constructor(f,delim =''){super(); this.leftover =''; f.on('data',(chunk)=&gt; {let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; return;} lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line', l);}); }}   class LineReader extends require('events')。EventEmitter {constructor(f,delim =''){super(); this.leftover =''; f.on('data',(chunk)=&gt; {let lines = chunk.split(delim); if(lines.length === 1){this.leftover + = chunk; return;} lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line', l);}); }}   分裂(DELIM); if(lines.length === 1){this.leftover + = chunk; 返回; } lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line',l); }); }}   分裂(DELIM); if(lines.length === 1){this.leftover + = chunk; 返回; } lines [0] = this.leftover + lines [0]; this.leftover = lines [lines.length-1]; if(this.leftover)lines.pop(); for(let l of lines)this.emit('line',l); }); }}  
     
			
        
5楼
0
  const fs = require(“fs”)fs.readFile('。/ file','utf-8',(err,data)=&gt; {var innerContent; console.log(“異步讀取:“+ data.toString()); const lines = data.toString()。split('')for(let line of lines)innerContent + = line +'&lt; br&gt;';});  
     
			
        

這首先讀取內存中的整個文件。 - Dan Dascalescu 1月28日10:36

6楼
0

我將每日線路處理的整個邏輯包裝為npm模塊: line-kit https://www.npmjs.com/package/line-kit

 < code> // example var count = 0 require('line-kit')(require('fs')。createReadStream('/ etc / issue'),(line)=&gt; {count ++;},()=&gt; ; {console.log(`see $ {count} lines`)})   

     
			
        
7楼
-10
readFileSync(file).toString()。split(/?/)。forEach(function(line){patternString.map((pattern)=&gt; {if(line.indexOf(pattern)!== -1){console .log(file +'contains`'+ pattern +'`in in line“'+ line +'”;'); result = 1;}});}); catch(e){console.log('錯誤:',e.stack); }}; process.exit(結果); })(); catch(e){console.log('錯誤:',e.stack); }}; process.exit(結果); })(); catch(e){console.log('錯誤:',e.stack); }}; process.exit(結果); })();
8楼
-20

我查看了以上所有答案,他們都使用第三方庫來解決它。它在Node的API中有一個簡單的解決方案。例如

  const fs = require('fs')let stream = fs.createReadStream('&lt; filename&gt;',{autoClose:true})stream.on('data',chunk = &gt; {let row = chunk.toString('ascii')}))