代码之家  ›  专栏  ›  技术社区  ›  Daniel Rika

在.htm中使用javascript读/写csv文件

  •  0
  • Daniel Rika  · 技术社区  · 9 年前

    简介: 我正在尝试制作一个html应用程序(.htm)来进行一些商业计算。随之而来的问题是,我需要保留所有事情的记录。 首先,我找到了一些用于读/写.mdb文件的visual basic脚本,但这对我来说太复杂了,因为我从未使用过vbs。 因此,我决定使用javascript来读/写.csv文件

    这是我为阅读找到的函数:

                function displayClassList() {
                var path="log.csv"
                var fso = new ActiveXObject('Scripting.FileSystemObject'),
                iStream=fso.OpenTextFile(path, 1, false);
                document.getElementById("searchResults").innerHTML="";
                while(!iStream.AtEndOfStream) {
                    var line=iStream.ReadLine();
                    document.getElementById("searchResults").innerHTML += line + "<br/>";
                }
                iStream.Close();
            }
    

    效果很好。

    我的问题是当涉及到写作时。我无法将文本附加到文档中的新行。这是我得到的脚本:

    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    var s = fso.CreateTextFile("./ClassList.csv", true); 
    s.WriteLine("helloworld"); 
    s.Close(); 
    } 
    

    这个脚本的问题是,它将所有现有文本替换为“helloworld”。我想要的是用新行写“地狱世界”。有什么解决办法吗?

    还有,是否有任何方法可以编辑特定行,例如替换x行中的所有文本?

    以下是供下载的脚本,以便您测试它们: http://ge.tt/7u5bDAV2/v/0

    2 回复  |  直到 9 年前
        1
  •  1
  •   user325117 user325117    9 年前

    如果要在不覆盖现有内容的情况下附加到文件,可以使用 OpenTextFile 方法-请注意 CreateTextFile 方法截断现有内容。

    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    var s = fso.OpenTextFile("./ClassList.csv", 8); 
    s.WriteLine("helloworld"); 
    s.Close(); 
    

    要修改文本文件的一行是不容易的,除非您所做的修改使该行保持相同的长度,否则如果您的更改较短,您将保留旧行的一部分不变,而如果更改较长,您将覆盖下一行。

    更重要的是,FileSystemObject不支持查找,您需要查找才能跳转到特定行。

    如果要修改文件的一行,最好的办法是:

    1. 打开现有文件进行读取,同时创建新文件进行写入
    2. 逐行读取现有文件,将要保留的内容写入新文件
    3. 根据需要将修改后的行写入新文件
    4. 关闭两个文件,并重命名新文件以替换旧文件

    话虽如此,如果您的数据文件是HTML或XML文档而不是CSV,可能会更容易,因为您可以使用DOM操作函数来读取和写入它。

        2
  •  0
  •   Jimbo Jonny    9 年前

    通常您使用 "\n" 在字符串中创建新行。它表示JS字符串中的换行符。

    以下是文本文件中“行”的工作方式。它只是一长串字符,其中一个可能的字符是换行符。当您查看文件时,无论哪个程序呈现该文件,它都只知道在之前的任何文本下方显示换行符后的文本。您可以通过换行符分割您读取的字符串,并获得一个表示每一行的数组,然后以这种方式处理它。然后编写时,您可以通过换行符连接该数组,并编写结果字符串。

    请注意,某些程序需要 "\r\n" 表示一个适当的换行符,并且不会仅为 “\n” …所以试试看 “\r\n” 如果您在为用于查看文本文件的程序获取换行符时遇到问题,请将其作为换行符。


    编辑: 既然你似乎不相信我,我就用代码向你证明。我是用.hta文件完成的,但概念是一样的。

    制作了一个文本文件“myText.txt”和一个包含代码的.hta文件。文本文件包含以下内容:

    This is line 1
    Line 2
    the third line
    line 4 and stuff
    fifth line
    

    然后,在我的代码中,我创建了这两个函数,以便于阅读和编写:

    function getFile(fname)
    {
        var opener = new ActiveXObject("Scripting.FileSystemObject");
        var pointer = opener.OpenTextFile(fname, 1, true);
        var cont = pointer.ReadAll();
        pointer.Close();
        return cont;
    }
    
    function setFile(fname, content)
    {
        var opener = new ActiveXObject("Scripting.FileSystemObject");
        var pointer = opener.OpenTextFile(fname, 2, true);
        pointer.WriteLine(content);
        pointer.Close();
    }
    

    对于我使用的程序,它使用 “\r\n” 换行符。这就是这个例子要用到的。我只需利用内容字符串的拆分和连接来编辑我选择的任何一行内容:

    var content = getFile('myFile.txt'); // read it
    var lineArr = content.split('\r\n'); // now we have an array of the file's lines
    lineArr[2] = 'NEW LINE CONTENT!'; // editing third line (indexed from 0)
    var newContent = lineArr.join('\r\n'); // make it text again with newlines
    setFile("myFile.txt", newContent); // write it
    

    现在,文本文件如下所示:

    This is line 1
    Line 2
    NEW LINE CONTENT!
    line 4 and stuff
    fifth line
    

    巴姆。 通过理解换行符在文本中的工作方式来编辑文本格式文件中的各行。