{"action":"created","issue":{"url":"https://api.github.com/repos/JuliaData/CSV.jl/issues/3","repository_url":"https://api.github.com/repos/JuliaData/CSV.jl","labels_url":"https://api.github.com/repos/JuliaData/CSV.jl/issues/3/labels{/name}","comments_url":"https://api.github.com/repos/JuliaData/CSV.jl/issues/3/comments","events_url":"https://api.github.com/repos/JuliaData/CSV.jl/issues/3/events","html_url":"https://github.com/JuliaData/CSV.jl/issues/3","id":94862250,"number":3,"title":"Requested CSV Parsing Features [comment here for new requests]","user":{"login":"quinnj","id":2896623,"avatar_url":"https://avatars.githubusercontent.com/u/2896623?v=3","gravatar_id":"","url":"https://api.github.com/users/quinnj","html_url":"https://github.com/quinnj","followers_url":"https://api.github.com/users/quinnj/followers","following_url":"https://api.github.com/users/quinnj/following{/other_user}","gists_url":"https://api.github.com/users/quinnj/gists{/gist_id}","starred_url":"https://api.github.com/users/quinnj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quinnj/subscriptions","organizations_url":"https://api.github.com/users/quinnj/orgs","repos_url":"https://api.github.com/users/quinnj/repos","events_url":"https://api.github.com/users/quinnj/events{/privacy}","received_events_url":"https://api.github.com/users/quinnj/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":23,"created_at":"2015-07-14T03:55:55Z","updated_at":"2016-08-12T17:37:29Z","closed_at":null,"body":"This issue is for listing out and refining the desired functionality of working with CSV files. The options so far, more or less implemented:\r\n\r\n- [x] Able to accept/detect compressed files as input; also able to tell CSV what compression to expect\r\n- [x] ~~Accept URLs as input (this may require some upstream work as Requests.jl sucks hardcore right now for downloading, but maybe we can just use Base.download)~~ [this might be something to revisit, but right now, we support `CSV.getfield(io::IOBuffer, ::Type{T})`, which would allow for fairly seamless streaming code\r\n- [x] Ability to specify an arbitrary ASCII delimiter\r\n- [x] ~~Ability to specify an arbitrary ASCII newline character; not sure what to do about CRLF (\\r\\n)~~ [we're just going to accept `\\r`, `\\n`, and `\\r\\n` and handle those three automatically]\r\n- [x] Ability to specify a quote character that quotes field values and allows delimiters/newlines in field values\r\n- [x] Ability to specify an escape character that allows for the quote character inside a quoted field value\r\n- [x] Ability to provide a custom header of column names\r\n- [x] Ability to specify a custom line where the column names can be found in the file; the data must start on the line following the column names; not sure what to do about headerless CSV files (if there is such a thing)\r\n- [x] Ability to specify the types `CSV` should expect for each column individually or for every column\r\n- [x] Ability to specify the date format a file\r\n- [x] Ability to tell CSV to use 'x' number of rows for type inference\r\n- [ ] Ability to specify a thousands separator character\r\n- [ ] Ability to specify a decimal character (e.g. ',' for Europe); not sure how to handle the implementation here\r\n- [x] Ability to specify a custom NULL value to expect (e.g. \"NA\", \"\\N\", \"NULL\", etc.)\r\n- [ ] Ability to skip blank lines\r\n- [ ] Ability to do \"SKIP, LIMIT\" type SQL functionality when parsing (i.e. read only a chunk of a file)\r\n- [ ] Ability to not parse specified columns (ignore them)\r\n- [x] Ability to specify a # of lines to skip at the end of a file\r\n- [ ] Right now, we skip leading whitespace for numeric field parsing, but we don't ignore trailing whitespace\r\n- [x] parse DateTime values\r\n\r\nThis is of course less feature-rich than pandas or data.table's fread, but I also had an epiphany of sorts the other day with regards to bazillion-feature CSV readers. *They have to provide so many features because their languages suck* Think about it, pandas needs to provide all these crazy options and parsing function capabilities because otherwise, you'd have to do additional processing in python, which kills the purpose of using a nice C pandas implementation. Same with R to some extent.\r\n\r\nFor CSV, I want to take the approach that if a certain feature can be done post parsing as efficiently as we'd be able to do it while parsing, then we shouldn't support it. Julia is great and fast, don't be afraid of processing your ugly, misshapen CSV files. We want this implementation to be fast and simple, no need to clutter with extraneous features. Sure we can provide stuff that is convenient for this or that, but I really don't think we need to go overboard.\r\n\r\n@johnmyleswhite @davidagold @jiahao @RaviMohan @StefanKarpinski"},"comment":{"url":"https://api.github.com/repos/JuliaData/CSV.jl/issues/comments/239511009","html_url":"https://github.com/JuliaData/CSV.jl/issues/3#issuecomment-239511009","issue_url":"https://api.github.com/repos/JuliaData/CSV.jl/issues/3","id":239511009,"user":{"login":"JeffBezanson","id":744556,"avatar_url":"https://avatars.githubusercontent.com/u/744556?v=3","gravatar_id":"","url":"https://api.github.com/users/JeffBezanson","html_url":"https://github.com/JeffBezanson","followers_url":"https://api.github.com/users/JeffBezanson/followers","following_url":"https://api.github.com/users/JeffBezanson/following{/other_user}","gists_url":"https://api.github.com/users/JeffBezanson/gists{/gist_id}","starred_url":"https://api.github.com/users/JeffBezanson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JeffBezanson/subscriptions","organizations_url":"https://api.github.com/users/JeffBezanson/orgs","repos_url":"https://api.github.com/users/JeffBezanson/repos","events_url":"https://api.github.com/users/JeffBezanson/events{/privacy}","received_events_url":"https://api.github.com/users/JeffBezanson/received_events","type":"User","site_admin":false},"created_at":"2016-08-12T17:37:29Z","updated_at":"2016-08-12T17:37:29Z","body":"Refactoring request: remove the dependency on DataFrames and (less importantly) NullableArrays.\r\n\r\nThe coupling to DataFrames already seems to be very light, which is great. AFAICT, the core functionality already just inserts values into a vector of column vectors. The only issue is that DataFrames is a pretty large dependency.\r\n\r\nI also think missing values should only be handled for columns of type `Nullable{T}`. If Nullable is requested or inferred as a column type then a NullableArray can be used for that column, I'm fine with that. Ideally you could also `stream!` into e.g. an `Array{Nullable}` if you wanted though."}}
{"actor":{"display_login":"JeffBezanson"}}