{"id":18597631,"url":"https://github.com/felipedemacedo/ruby-sheet-manipulator","last_synced_at":"2025-05-16T13:33:54.982Z","repository":{"id":86518111,"uuid":"144577695","full_name":"felipedemacedo/ruby-sheet-manipulator","owner":"felipedemacedo","description":"Methods to load CSV sheets into memory and apply changes to it.","archived":false,"fork":false,"pushed_at":"2018-08-31T17:55:41.000Z","size":29,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-17T23:45:32.009Z","etag":null,"topics":["csv","loader","ruby","sheet"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/felipedemacedo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-13T12:37:18.000Z","updated_at":"2018-08-29T20:39:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"fdb3d334-2d66-485b-959b-5fd8d2835525","html_url":"https://github.com/felipedemacedo/ruby-sheet-manipulator","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipedemacedo%2Fruby-sheet-manipulator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipedemacedo%2Fruby-sheet-manipulator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipedemacedo%2Fruby-sheet-manipulator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipedemacedo%2Fruby-sheet-manipulator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/felipedemacedo","download_url":"https://codeload.github.com/felipedemacedo/ruby-sheet-manipulator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254538635,"owners_count":22087897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csv","loader","ruby","sheet"],"created_at":"2024-11-07T01:28:51.795Z","updated_at":"2025-05-16T13:33:54.958Z","avatar_url":"https://github.com/felipedemacedo.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ruby Sheet Manipulator\n\nBasic sheet manipulator in Ruby. ([Source Code](https://github.com/felipedemacedo/ruby-sheet-manipulator))\n\n### Sample sheet:\n![sheet_example](https://user-images.githubusercontent.com/7635127/44288672-81de3000-a247-11e8-899a-e9c6284ecbd0.png)\n\n```markdown\nCol A;Col B;Col C\n;;\n123;456   ;789\n12;   34;56\n;\n;;\n78;90;1   \na;b;c\n\n\n\ndD;Ee;fF\n\n\n;;;;;\n\n;;\n;;;\n```\n\n## Usage examples:\n\n### Point to the sheet file\n```markdown\nsheet = Sheet.new(\"./example_sheets/skip_blank_lines/sheet.csv\")\n------------------------------------------------------\n#\u003cSheet:0xc2bbf78 @path=\"./example_sheets/skip_blank_lines/sheet.csv\", @file=#\u003cFile:./example_sheets/skip_blank_lines/sheet.csv\u003e, @column_separator=\";\"\u003e\n```\n### Point to the sheet file with custom column separator\n```markdown\nsheet = Sheet.new(\"./example_sheets/skip_blank_lines/sheet.csv\", \",\")\n------------------------------------------------------\n#\u003cSheet:0xc2bbf18 @path=\"./example_sheets/skip_blank_lines/sheet.csv\", @file=#\u003cFile:./example_sheets/skip_blank_lines/sheet.csv\u003e, @column_separator=\",\"\u003e\n```\n### Load the sheet into memory\n```markdown\nsheet = Sheet.new(\"./example_sheets/skip_blank_lines/sheet.csv\")\nsheet.load()\n------------------------------------------------------\n** LOADING \n  DATA: \n\";;\\n\"\n\"123;456   ;789\\n\"\n\"12;   34;56\\n\"\n\";\\n\"\n\";;\\n\"\n\"78;90;1   \\n\"\n\"a;b;c\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"dD;Ee;fF\\n\"\n\"\\n\"\n\"\\n\"\n\";;;;;\\n\"\n\"\\n\"\n\";;\\n\"\n\";;;\"\n--\n```\n### Load the sheet into memory as an Array\n```markdown\nsheet = Sheet.new(\"./example_sheets/skip_blank_lines/sheet.csv\")\nsheet.load_as_array()\n------------------------------------------------------\n** LOADING AS ARRAY\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"123\", \"456   \", \"789\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n[]\n--\n```\n### Load the sheet into memory as a Hash\n```markdown\nsheet = Sheet.new(\"./example_sheets/skip_blank_lines/sheet.csv\")\nsheet.load_as_hash()\n------------------------------------------------------\n** LOADING AS HASH\n  DATA: \n{\"Col A\"=\u003e\"\", \"Col B\"=\u003e\"\", \"Col C\"=\u003e\"\\n\"}\n{\"Col A\"=\u003e\"123\", \"Col B\"=\u003e\"456   \", \"Col C\"=\u003e\"789\\n\"}\n{\"Col A\"=\u003e\"12\", \"Col B\"=\u003e\"   34\", \"Col C\"=\u003e\"56\\n\"}\n{\"Col A\"=\u003e\"\", \"Col B\"=\u003e\"\\n\", \"Col C\"=\u003enil}\n{\"Col A\"=\u003e\"\", \"Col B\"=\u003e\"\", \"Col C\"=\u003e\"\\n\"}\n{\"Col A\"=\u003e\"78\", \"Col B\"=\u003e\"90\", \"Col C\"=\u003e\"1   \\n\"}\n{\"Col A\"=\u003e\"a\", \"Col B\"=\u003e\"b\", \"Col C\"=\u003e\"c\\n\"}\n{\"Col A\"=\u003e\"\\n\", \"Col B\"=\u003enil, \"Col C\"=\u003enil}\n{\"Col A\"=\u003e\"\\n\", \"Col B\"=\u003enil, \"Col C\"=\u003enil}\n{\"Col A\"=\u003e\"\\n\", \"Col B\"=\u003enil, \"Col C\"=\u003enil}\n{\"Col A\"=\u003e\"dD\", \"Col B\"=\u003e\"Ee\", \"Col C\"=\u003e\"fF\\n\"}\n{\"Col A\"=\u003e\"\\n\", \"Col B\"=\u003enil, \"Col C\"=\u003enil}\n{\"Col A\"=\u003e\"\\n\", \"Col B\"=\u003enil, \"Col C\"=\u003enil}\n{\"Col A\"=\u003e\"\", \"Col B\"=\u003e\"\", \"Col C\"=\u003e\"\"}\n{\"Col A\"=\u003e\"\\n\", \"Col B\"=\u003enil, \"Col C\"=\u003enil}\n{\"Col A\"=\u003e\"\", \"Col B\"=\u003e\"\", \"Col C\"=\u003e\"\\n\"}\n{\"Col A\"=\u003enil, \"Col B\"=\u003enil, \"Col C\"=\u003enil}\n--\n```\n### Remove all blank lines from sheet\n```markdown\nsheet.skip_blank_lines()\n------------------------------------------------------\n** BACKUP STORED !\nREMOVE_BLANK_LINES APPLIED !\n  DATA: \n[\"123\", \"456   \", \"789\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n--\n```\n### Get rid of leading and trailing whitespaces\n```markdown\nsheet.skip_whitespaces()\n------------------------------------------------------\n** BACKUP STORED !\nREMOVE_WHITESPACES APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"123\", \"456\", \"789\\n\"]\n[\"12\", \"34\", \"56\\n\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"78\", \"90\", \"1\\n\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n--\n```\n### Remove all line breaks\n```markdown\nsheet.skip_line_breaks()\n------------------------------------------------------\n** BACKUP STORED !\nREMOVE_LINE_BREAKS APPLIED !\n  DATA: \n[\"\", \"\", \"\"]\n[\"123\", \"456   \", \"789\"]\n[\"12\", \"   34\", \"56\"]\n[\"\", \"\"]\n[\"\", \"\", \"\"]\n[\"78\", \"90\", \"1   \"]\n[\"a\", \"b\", \"c\"]\n[\"\"]\n[\"\"]\n[\"\"]\n[\"dD\", \"Ee\", \"fF\"]\n[\"\"]\n[\"\"]\n[\"\", \"\", \"\", \"\", \"\", \"\"]\n[\"\"]\n[\"\", \"\", \"\"]\n--\n```\n### Remove similar lines\n```markdown\nsheet.uniq()\n------------------------------------------------------\n** BACKUP STORED !\nUNIQ APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"123\", \"456   \", \"789\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"\", \"\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[]\n--\n```\n### Sort all lines of the sheet\n```markdown\nsheet.sort()\n------------------------------------------------------\n** BACKUP STORED !\nSORT APPLIED !\n  DATA: \n[]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"\", \"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"123\", \"456   \", \"789\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n--\n```\n### UPCASE\n```markdown\nsheet.upcase()\n------------------------------------------------------\n** BACKUP STORED !\nAPPLY_UPCASE APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"123\", \"456   \", \"789\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"A\", \"B\", \"C\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"DD\", \"EE\", \"FF\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n--\n```\n### downcase\n```markdown\nsheet.downcase()\n------------------------------------------------------\n** BACKUP STORED !\nAPPLY_DOWNCASE APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"123\", \"456   \", \"789\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"dd\", \"ee\", \"ff\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n--\n```\n### Remove all numeric elements from the sheet.\n```markdown\nsheet.skip_numeric()\n------------------------------------------------------\n** BACKUP STORED !\nREMOVE_NUMERICS APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"\", \"\", \"\"]\n[\"\", \"\", \"\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"\", \"\", \"\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n--\n```\n### Remove all non-numeric elements from the sheet.\n```markdown\nsheet.skip_non_numeric()\n------------------------------------------------------\n** BACKUP STORED !\nREMOVE_NON_NUMERICS APPLIED !\n  DATA: \n[\"\", \"\", \"\"]\n[\"123\", \"\", \"\"]\n[\"12\", \"\", \"\"]\n[\"\", \"\"]\n[\"\", \"\", \"\"]\n[\"78\", \"90\", \"\"]\n[\"\", \"\", \"\"]\n[\"\"]\n[\"\"]\n[\"\"]\n[\"\", \"\", \"\"]\n[\"\"]\n[\"\"]\n[\"\", \"\", \"\", \"\", \"\", \"\"]\n[\"\"]\n[\"\", \"\", \"\"]\n[]\n--\n```\n### You can always come back and undo last change.\n```markdown\nsheet.skip_numeric()\nsheet.rollback()\n------------------------------------------------------\n** BACKUP STORED !\nREMOVE_NUMERICS APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"\", \"\", \"\"]\n[\"\", \"\", \"\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"\", \"\", \"\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n--\n** ROLLED BACK !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"123\", \"456   \", \"789\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"a\", \"b\", \"c\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"dD\", \"Ee\", \"fF\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n[]\n--\n```\n### Some methods can be applied into specific columns only.\nFor instance: upcase, downcase, skip_line_breaks, skip_whitespaces, skip_numeric, skip_non_numeric\n```markdown\nsheet.upcase([0,1])\n------------------------------------------------------\n****************************SPECIFIC COLUMNS: [0,1]\n** BACKUP STORED !\nAPPLY_UPCASE APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\"]\n[\"123\", \"456   \", \"789\\n\"]\n[\"12\", \"   34\", \"56\\n\"]\n[\"\", \"\\n\"]\n[\"\", \"\", \"\\n\"]\n[\"78\", \"90\", \"1   \\n\"]\n[\"A\", \"B\", \"c\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"DD\", \"EE\", \"fF\\n\"]\n[\"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n\"]\n[\"\", \"\", \"\\n\"]\n--\n```\n### Create your own methods and apply it over the sheet (on specific columns if you want)!\nFor example, let's say you have two methods. The first one duplicates whatever it receives as parameter.\nThe second one concatenates a string for every cell it gets.\n```markdown\ndef myFirstMethod(str)\n  str*2 unless str.nil?\nend\n\ndef mySecondMethod(str)\n  str + \" \u003c\u003c OK.\" unless str.nil?\nend\n\nsheet.apply(method(:myFirstMethod))\nsheet.rollback()\nsheet.apply(method(:mySecondMethod))\nsheet.rollback()\nsheet.apply(method(:mySecondMethod), [0])\n------------------------------------------------------\n** BACKUP STORED !\nMYFIRSTMETHOD APPLIED !\n  DATA: \n[\"\", \"\", \"\\n\\n\"]\n[\"123123\", \"456   456   \", \"789\\n789\\n\"]\n[\"1212\", \"   34   34\", \"56\\n56\\n\"]\n[\"\", \"\\n\\n\"]\n[\"\", \"\", \"\\n\\n\"]\n[\"7878\", \"9090\", \"1   \\n1   \\n\"]\n[\"aa\", \"bb\", \"c\\nc\\n\"]\n[\"\\n\\n\"]\n[\"\\n\\n\"]\n[\"\\n\\n\"]\n[\"dDdD\", \"EeEe\", \"fF\\nfF\\n\"]\n[\"\\n\\n\"]\n[\"\\n\\n\"]\n[\"\", \"\", \"\", \"\", \"\", \"\\n\\n\"]\n[\"\\n\\n\"]\n[\"\", \"\", \"\\n\\n\"]\n[]\n--\n** ROLLED BACK !\n** BACKUP STORED !\nMYSECONDMETHOD APPLIED !\n  DATA: \n[\" \u003c\u003c OK.\", \" \u003c\u003c OK.\", \"\\n \u003c\u003c OK.\"]\n[\"123 \u003c\u003c OK.\", \"456    \u003c\u003c OK.\", \"789\\n \u003c\u003c OK.\"]\n[\"12 \u003c\u003c OK.\", \"   34 \u003c\u003c OK.\", \"56\\n \u003c\u003c OK.\"]\n[\" \u003c\u003c OK.\", \"\\n \u003c\u003c OK.\"]\n[\" \u003c\u003c OK.\", \" \u003c\u003c OK.\", \"\\n \u003c\u003c OK.\"]\n[\"78 \u003c\u003c OK.\", \"90 \u003c\u003c OK.\", \"1   \\n \u003c\u003c OK.\"]\n[\"a \u003c\u003c OK.\", \"b \u003c\u003c OK.\", \"c\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"dD \u003c\u003c OK.\", \"Ee \u003c\u003c OK.\", \"fF\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\" \u003c\u003c OK.\", \" \u003c\u003c OK.\", \" \u003c\u003c OK.\", \" \u003c\u003c OK.\", \" \u003c\u003c OK.\", \"\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\" \u003c\u003c OK.\", \" \u003c\u003c OK.\", \"\\n \u003c\u003c OK.\"]\n[]\n--\n** ROLLED BACK !\n****************************SPECIFIC COLUMNS: [0]\n** BACKUP STORED !\nMYSECONDMETHOD APPLIED !\n  DATA: \n[\" \u003c\u003c OK.\", \"\", \"\\n\"]\n[\"123 \u003c\u003c OK.\", \"456   \", \"789\\n\"]\n[\"12 \u003c\u003c OK.\", \"   34\", \"56\\n\"]\n[\" \u003c\u003c OK.\", \"\\n\"]\n[\" \u003c\u003c OK.\", \"\", \"\\n\"]\n[\"78 \u003c\u003c OK.\", \"90\", \"1   \\n\"]\n[\"a \u003c\u003c OK.\", \"b\", \"c\\n\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"dD \u003c\u003c OK.\", \"Ee\", \"fF\\n\"]\n[\"\\n \u003c\u003c OK.\"]\n[\"\\n \u003c\u003c OK.\"]\n[\" \u003c\u003c OK.\", \"\", \"\", \"\", \"\", \"\\n\"]\n[\"\\n \u003c\u003c OK.\"]\n[\" \u003c\u003c OK.\", \"\", \"\\n\"]\n[]\n--\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelipedemacedo%2Fruby-sheet-manipulator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffelipedemacedo%2Fruby-sheet-manipulator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelipedemacedo%2Fruby-sheet-manipulator/lists"}