如何在JavaScript中读取文本文件

CRS*_*CRS 41 javascript html5 text

我正在尝试将文本文件加载到我的JavaScript文件中,然后从该文件中读取行以获取信息,我尝试了FileReader但它似乎没有工作.有人可以帮忙吗?

function analyze(){
   var f = new FileReader();

   f.onloadend = function(){
       console.log("success");
   }
   f.readAsText("cities.txt");
}
Run Code Online (Sandbox Code Playgroud)

bcm*_*ney 47

是的,有可能使用FileReader,我已经做了一个这样的例子,这里是代码:

<!DOCTYPE html>
<html>
  <head>
    <title>Read File (via User Input selection)</title>
    <script type="text/javascript">
    var reader; //GLOBAL File Reader object for demo purpose only

    /**
     * Check for the various File API support.
     */
    function checkFileAPI() {
        if (window.File && window.FileReader && window.FileList && window.Blob) {
            reader = new FileReader();
            return true; 
        } else {
            alert('The File APIs are not fully supported by your browser. Fallback required.');
            return false;
        }
    }

    /**
     * read text input
     */
    function readText(filePath) {
        var output = ""; //placeholder for text output
        if(filePath.files && filePath.files[0]) {           
            reader.onload = function (e) {
                output = e.target.result;
                displayContents(output);
            };//end onload()
            reader.readAsText(filePath.files[0]);
        }//end if html5 filelist support
        else if(ActiveXObject && filePath) { //fallback to IE 6-8 support via ActiveX
            try {
                reader = new ActiveXObject("Scripting.FileSystemObject");
                var file = reader.OpenTextFile(filePath, 1); //ActiveX File Object
                output = file.ReadAll(); //text contents of file
                file.Close(); //close file "input stream"
                displayContents(output);
            } catch (e) {
                if (e.number == -2146827859) {
                    alert('Unable to access local files due to browser security settings. ' + 
                     'To overcome this, go to Tools->Internet Options->Security->Custom Level. ' + 
                     'Find the setting for "Initialize and script ActiveX controls not marked as safe" and change it to "Enable" or "Prompt"'); 
                }
            }       
        }
        else { //this is where you could fallback to Java Applet, Flash or similar
            return false;
        }       
        return true;
    }   

    /**
     * display content using a basic HTML replacement
     */
    function displayContents(txt) {
        var el = document.getElementById('main'); 
        el.innerHTML = txt; //display output in DOM
    }   
</script>
</head>
<body onload="checkFileAPI();">
    <div id="container">    
        <input type="file" onchange='readText(this)' />
        <br/>
        <hr/>   
        <h3>Contents of the Text file:</h3>
        <div id="main">
            ...
        </div>
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

使用ActiveX对象也可以做同样的事情来支持IE的一些旧版本(我认为6-8),我有一些旧的代码也可以做到这一点,但它已经有一段时间所以我将不得不挖掘它我找到了一个类似于我用Jacky Cui博客提供的解决方案并编辑了这个答案(也清理了一些代码).希望能帮助到你.

最后,我刚刚阅读了其他一些让我参与抽奖的答案,但正如他们所建议的那样,您可能正在寻找允许您从JavaScript文件所在的服务器(或设备)加载文本文件的代码.如果是这种情况,那么您希望AJAX代码动态加载文档,如下所示:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" />
<title>Read File (via AJAX)</title>
<script type="text/javascript">
var reader = new XMLHttpRequest() || new ActiveXObject('MSXML2.XMLHTTP');

function loadFile() {
    reader.open('get', 'test.txt', true); 
    reader.onreadystatechange = displayContents;
    reader.send(null);
}

function displayContents() {
    if(reader.readyState==4) {
        var el = document.getElementById('main');
        el.innerHTML = reader.responseText;
    }
}

</script>
</head>
<body>
<div id="container">
    <input type="button" value="test.txt"  onclick="loadFile()" />
    <div id="main">
    </div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 对于“this”关键字,实际上只是个人偏好的事情,除非它内嵌在一个元素上,否则我不太关心它...... http://tech.pro/tutorial/1192/avoiding-the-this-problem- in-javascript 至于“阅读器”,是的,这可能是一个有效的观点,但同样,不希望以一种“阅读”混淆的方式使用项目。如果有多种方式来引用一个对象,我会说选择一种你以后最喜欢阅读的方式。 (2认同)

小智 10

使用javascript XMLHttpRequest()类(AJAX)可以非常轻松地完成此操作:

function FileHelper()

{
    FileHelper.readStringFromFileAtPath = function(pathOfFileToReadFrom)
    {
        var request = new XMLHttpRequest();
        request.open("GET", pathOfFileToReadFrom, false);
        request.send(null);
        var returnValue = request.responseText;

        return returnValue;
    }
}

...

var text = FileHelper.readStringFromFileAtPath ( "mytext.txt" );
Run Code Online (Sandbox Code Playgroud)


Mel*_*orn 9

出于安全原因,Javascript无权访问用户的文件系统.FileReader仅适用于用户手动选择的文件.

  • 这假设OP正在讨论客户端计算机上的文件.如果服务器上有可用的东西,那么它可以通过AJAX加载. (2认同)

yay*_*aya 5

(小提琴: https://jsfiddle.net/ya3ya6/7hfkdnrg/2/

  1. 用法

网页:

<textarea id='tbMain' ></textarea>
<a id='btnOpen' href='#' >Open</a>
Run Code Online (Sandbox Code Playgroud)

杰斯:

document.getElementById('btnOpen').onclick = function(){
    openFile(function(txt){
        document.getElementById('tbMain').value = txt; 
    });
}
Run Code Online (Sandbox Code Playgroud)
  1. Js助手函数
function openFile(callBack){
  var element = document.createElement('input');
  element.setAttribute('type', "file");
  element.setAttribute('id', "btnOpenFile");
  element.onchange = function(){
      readText(this,callBack);
      document.body.removeChild(this);
      }

  element.style.display = 'none';
  document.body.appendChild(element);

  element.click();
}

function readText(filePath,callBack) {
    var reader;
    if (window.File && window.FileReader && window.FileList && window.Blob) {
        reader = new FileReader();
    } else {
        alert('The File APIs are not fully supported by your browser. Fallback required.');
        return false;
    }
    var output = ""; //placeholder for text output
    if(filePath.files && filePath.files[0]) {           
        reader.onload = function (e) {
            output = e.target.result;
            callBack(output);
        };//end onload()
        reader.readAsText(filePath.files[0]);
    }//end if html5 filelist support
    else { //this is where you could fallback to Java Applet, Flash or similar
        return false;
    }       
    return true;
}
Run Code Online (Sandbox Code Playgroud)