首页 文章

在Javascript中加载文本文件会添加意外的额外隐藏字符

提问于
浏览
1

也许这只是极度缺乏睡眠,但我无法弄清楚为什么会这样 . 我有一个4个字母的文本文件,每行一个,如下所示:

text
lolz
test
word

当我尝试逐行将此文件加载到一个数组中时,我得到的字符串长度为5个字符!

var request = new XMLHttpRequest();
request.open("GET", "test.txt");
request.onloadend = function()
{
    var wordList = request.response;
    wordList = wordList.split('\n');

    console.log(wordList[2].length);
}
request.send();

我正在使用记事本进行编辑,我发现每行末尾没有空格 . sting.split()函数应该删除字符串被拆分的字符,因此额外的字符不应该是'\ n' . 使用Chrome中的console.log,我无法确定实际上是多余的字符 . 似乎没有!

2 回答

  • 3

    如果您以前从未遇到过这种情况,这可能是一个奇怪的问题 . 有时不仅包含一个'\ n'字符用于新行(您似乎已经熟悉它),而且还包含'\ n'字符用于“回车” . 这意味着除了跳过一个空格,开始一个新行之外,打字机需要一直向左移动 . 我不确定你能预测什么时候你会得到回车......它可能是特定于平台的吗?或者也许文本编辑器具体?也许有真正知识的人可以扩展这个答案 .

    无论如何,现在,尝试为每个条目添加一个trim(),这应该摆脱你看不到的隐藏'\ r',如下所示:

    var request = new XMLHttpRequest();
    request.open("GET", "test.txt");
    request.onloadend = function()
    {
        var wordList = request.response;
        wordList = wordList.split('\n');
    
        for(var i = 0; i < wordList.length; i++)
            wordList[i] = wordList[i].trim();
    
        console.log(wordList[4].length);
    }
    request.send();
    
  • 1

    分割日期字符串时遇到了同样的问题;在每个数组项的开头和结尾添加了一个额外的'non-visible'字符; string.trim() 没有用 .

    我花了2天时间来完成以下工作:

    从以下位置创建日期时间数组:

    var datetime = new Date();
            var dt = datetime.toLocaleString();
            var datetimearray=dt.split(" ");
    

    从datetime数组创建日期和时间字符串:

    var date=datetimearray[0];
            var time=datetimearray[1];
    

    拆分日期和时间字符串:

    var datearray=datetimearray[0].split("/");
            var timearray=datetimearray[1].split(":");
    

    然后将每个日期和时间元素转换为数字:

    var day =  getNumberFromString(datearray[0]);
            var month= getNumberFromString(datearray[1]);
            var year = getNumberFromString(datearray[2]);
            var hour =  getNumberFromString(timearray[0]);
            var minute= getNumberFromString(timearray[1]);
            var second = getNumberFromString(timearray[2]);
    

    getNumberFromString函数:

    function getNumberFromString(string)
        {
            var stringsplit=string.split("");
            var stringlen=string.length;  // If it is the year part of the date, the length is 6
            switch(stringlen)
            {
                 case 3:  // The last part of the time element (seconds) is only 3 for some reason
                 case 4:  // The two character elements (day, month, hour, minute) are length 4 after the split
                   var string1=stringsplit[1];  // create the first needed character from second array element; index 1
                   var string2=stringsplit[2];  // create the second needed character from third array element; index 2
    
                   string=string1+string2;  //add the 2 new elements together
                   return parseInt(string); //convert the number as a string to a number
    
                case 6:  // For the date string; similar to the above 
                  string1=stringsplit[1];
                  string2=stringsplit[2];
                  string3=stringsplit[3];
                  string4=stringsplit[4];
                  year1=string1+string2;
                  year1num=parseInt(year1);
                  year2=string3+string4;
                  year2num=parseInt(year2);
                  return [year1,year2];            
            }
        }
    

    最后创建了一个用于某些加密的查找数组:

    var lookup=[day,month,year1,year2,hour,minute,second];
    

    如果有人能告诉我一个更短的路,我将不胜感激 .

相关问题