Search code examples
filetypesiojulia

Julia - specify type with readdlm


I have a large text file with small numbers which I need to import using Julia. A toy example is

7

31 16

90 2 53

I found readdlm. When I go a = readdlm("FileName.txt") it works but the resulting array is of type Any and the resulting computations are really slow. I've tried and failed to specify the type as int or specifically Int16.

How do I do that correctly? Also if I use readdlm, do I have to close the file.


Solution

  • Your toy example would give you errors in case you specify types as there are some missing values in there. These missing values are handled as strings in Julia so the Type of your table would end up being Any as readdlm can't figure out whether these are numeric/character values. Row1 has only 1 value while row2 has 2, etc, giving you the missing values.

    In case all your data is nice and clean in the text file, you can set the Type of the table in readdlm:

    int_table = readdlm("FileName2.txt", Int16)
    int_table
    3x3 Array{Int16,2}:
      7   0   0
     31  16   0
     90   2  53
    

    Where FileName2.txt is:

    7   0   0
    31  16  0
    90  2   53
    

    However, if your data has missing values, you will need to convert them to some numeric values or use the DataFrames package to handle them. I'm assuming here that you want a pure integer Array so I fill the values with 0:

    any_table = readdlm("FileName.txt")
    
    any_table
    3x3 Array{Any,2}:
      7    ""    ""
     31  16      ""
     90   2    53  
    
    # fill missing values with 0
    any_table[any_table .== ""] .= 0
    
    # convert to integer table
    clean_array = Array{Int16}(any_table)
    
    clean_array
    3x3 Array{Int16,2}:
      7   0   0
     31  16   0
     90   2  53
    

    Readdlm closes the file for you, so you don't have to worry about that.