【问题标题】:Parsing text in Julia- Invalid ascii sequence在 Julia 中解析文本 - 无效的 ascii 序列
【发布时间】:2014-09-20 08:03:40
【问题描述】:

我正在尝试格式化数据文件,以便我的其他程序能够正确处理它。我正在尝试处理以下数据,但遇到了一个非常奇怪的错误,我似乎无法解决。

https://snap.stanford.edu/data/wiki-RfA.html

我正在尝试将数据格式化为 [SRC TGT VOT],所以我希望输出文件的前两行是

1 2 1
3 2 1

因为用户 1(首先存储在用户字典中)用 VOT 1 投票给用户 2,然后用户 3 用 VOT 1 投票给用户 2。我的问题是,当我尝试在下面运行我的代码时,我总是以收到一个非常奇怪的“无效的 ascii 序列”错误 - 谁能帮我确定问题或找到解决方法?如果我能知道我做错了什么显然是最好的。谢谢! 请注意,我知道这是一个有点具体的问题,我感谢任何帮助 - 我对这个错误感到困惑,目前不知道如何解决它。

f=open("original_vote_data.txt") #this is the file linked above
arr=readlines(f)
i=edge_count=src=tgt=vot=1
dict=Dict{ASCIIString, Int64}()
edges=["" for k=1:198275]
while i<1586200
    src_temp=(arr[i])[5:end-2]
    if (haskey(dict, src_temp)) 
        new_src= dict[src_temp]
    else 
        dict[src_temp]=src
        new_src=src
        src=src+1
    end
    tgt_temp=(arr[i+1])[5:end-2]
    if (haskey(dict, tgt_temp)) 
        new_tgt= dict[tgt_temp]
    else 
        dict[tgt_temp]=tgt
        new_tgt=tgt
        tgt=tgt+1
    end
    vot_temp=(arr[i+2])[5]
    edges[edge_count]=string(new_src)* " " * string(new_tgt)* " " *string(vot_temp)
    edge_count=edge_count+1
    i=i+8
end

【问题讨论】:

  • 我没有仔细看这个,但我的预感在第四行:dict=Dict{ASCIIString, Int64}。这是用户名所在的位置吗?用户名有时是 unicode 吗?也许试试Dict{UTF8String, Int64}。边缘也类似——试试edges=Array(UTF8String,198275)
  • 谢谢!我的延迟很长,但我明天会试试这个。希望你是对的!
  • @user3587051 你的问题解决了吗?
  • @Jubobs 是的,谢谢!

标签: file parsing ascii julia


【解决方案1】:

我们开始 - 我会写下我的评论作为答案,因为它似乎已经解决了这个问题。

我认为错误源于第四行 (dict=Dict{ASCIIString, Int64}) 的预感是,如果您尝试在其中存储非 ASCII 字符,ASCIIStrings 会出错。由于此文件来自国际站点,因此用户名中(或数据中的其他位置)中包含 unicode 字符的可能性不大。所以简单的解决方法是将ASCIIString 的所有实例更改为UTF8String

为了让这个答案更完整,我下载了文件并尝试运行程序。最简单的调试方法是在 REPL 的顶层运行脚本,然后检查错误后的程序状态。抛出错误后,i==3017。现在只需尝试逐步运行 while 循环的每一行。您会很快看到第 3017 行包含 "SRC:Guðsþegn\n" — unicode,正如我所怀疑的那样。当您尝试在dict 中创建一个新条目并将其作为键时,该错误应该回溯到setindex! in dict.jl,您会看到它正在尝试将键(UTF8String)转换为ASCIIString。因此,将字典类型更改为具有 UTF8String 键即可解决问题。

事实证明,edges 数组只包含三个整数的字符串(有时是连字符),所以 ASCIIString 是可以的,但还是有点危险。我可能会将该信息存储在一个更专用的整数数组中,而不是将其转换为以空格分隔的字符串:您知道字符串中的前两个元素是整数,但最后一个元素是来自文件本身的未经验证的文本......可能是 unicode 或空格本身(这可能会影响后续处理)。

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多