From ab2ec8d28f3f03cad37112bfcd8d29bef944cb5d Mon Sep 17 00:00:00 2001 From: allanaaa Date: Tue, 7 Jul 2020 15:16:27 -0400 Subject: [PATCH] Adding mostly-empty docs (#2892) Skeleton and initial content for documentation --- docs/docs/manual/exploring.md | 102 ++++++++ docs/docs/manual/exporters/csv.md | 7 - docs/docs/manual/exporters/gsheets.md | 6 - docs/docs/manual/exporters/ods.md | 6 - docs/docs/manual/exporting.md | 39 +++ docs/docs/manual/expressions.md | 57 +++++ docs/docs/manual/facets/numeric.md | 7 - docs/docs/manual/facets/scatterplot.md | 7 - docs/docs/manual/facets/text.md | 7 - docs/docs/manual/glossary.md | 5 + docs/docs/manual/grel/cross.md | 6 - docs/docs/manual/grel/facetCount.md | 6 - docs/docs/manual/grel/toString.md | 6 - docs/docs/manual/importers/csv.md | 7 - docs/docs/manual/importers/json.md | 7 - docs/docs/manual/importers/xml.md | 7 - docs/docs/manual/install.md | 17 -- docs/docs/manual/installing.md | 128 ++++++++++ .../{operations => }/key_value_columnize.md | 0 docs/docs/manual/operations/add_column.md | 7 - docs/docs/manual/operations/blank_down.md | 7 - docs/docs/manual/operations/fill_down.md | 7 - docs/docs/manual/operations/recon.md | 7 - docs/docs/manual/operations/transform.md | 7 - docs/docs/manual/records_mode.md | 8 - docs/docs/manual/running.md | 124 +++++++++ docs/docs/manual/starting.md | 235 ++++++++++++++++++ docs/docs/manual/transforming.md | 118 +++++++++ docs/docs/manual/troubleshooting.md | 35 +++ docs/docs/manual/user_data.md | 17 -- docs/docs/manual/wikidata.md | 33 +++ docs/sidebars.js | 43 +--- docs/static/img/databaseconnect.jpg | Bin 0 -> 30632 bytes docs/static/img/history.jpg | Bin 0 -> 18783 bytes docs/static/img/import.jpg | Bin 0 -> 27021 bytes 35 files changed, 887 insertions(+), 188 deletions(-) create mode 100644 docs/docs/manual/exploring.md delete mode 100644 docs/docs/manual/exporters/csv.md delete mode 100644 docs/docs/manual/exporters/gsheets.md delete mode 100644 docs/docs/manual/exporters/ods.md create mode 100644 docs/docs/manual/exporting.md create mode 100644 docs/docs/manual/expressions.md delete mode 100644 docs/docs/manual/facets/numeric.md delete mode 100644 docs/docs/manual/facets/scatterplot.md delete mode 100644 docs/docs/manual/facets/text.md create mode 100644 docs/docs/manual/glossary.md delete mode 100644 docs/docs/manual/grel/cross.md delete mode 100644 docs/docs/manual/grel/facetCount.md delete mode 100644 docs/docs/manual/grel/toString.md delete mode 100644 docs/docs/manual/importers/csv.md delete mode 100644 docs/docs/manual/importers/json.md delete mode 100644 docs/docs/manual/importers/xml.md delete mode 100644 docs/docs/manual/install.md create mode 100644 docs/docs/manual/installing.md rename docs/docs/manual/{operations => }/key_value_columnize.md (100%) delete mode 100644 docs/docs/manual/operations/add_column.md delete mode 100644 docs/docs/manual/operations/blank_down.md delete mode 100644 docs/docs/manual/operations/fill_down.md delete mode 100644 docs/docs/manual/operations/recon.md delete mode 100644 docs/docs/manual/operations/transform.md delete mode 100644 docs/docs/manual/records_mode.md create mode 100644 docs/docs/manual/running.md create mode 100644 docs/docs/manual/starting.md create mode 100644 docs/docs/manual/transforming.md create mode 100644 docs/docs/manual/troubleshooting.md delete mode 100644 docs/docs/manual/user_data.md create mode 100644 docs/docs/manual/wikidata.md create mode 100644 docs/static/img/databaseconnect.jpg create mode 100644 docs/static/img/history.jpg create mode 100644 docs/static/img/import.jpg diff --git a/docs/docs/manual/exploring.md b/docs/docs/manual/exploring.md new file mode 100644 index 000000000..1f7f311cf --- /dev/null +++ b/docs/docs/manual/exploring.md @@ -0,0 +1,102 @@ +--- + +id: exploring + +title: Exploring data + +sidebar_label: Exploring data + +--- + + +## Overview + + +### Cell data types + + + +* Automatic recognition; colours, etc. +* [https://github.com/OpenRefine/OpenRefine/wiki/Cell-Editing](https://github.com/OpenRefine/OpenRefine/wiki/Cell-Editing) +* What an error looks like + + +### Null vs empty string + + + +* Viewing null values + + +### Rows vs. records + + + +* Functions that matter to rows/records distinction + + +## Facets + + +### Overview + +(Types of Facet views and their common controls such as dragging Facets, organizing, sub elements like include/exclude, edit, sort by, change, reset, etc.) + + +### Text facet + + +### Numeric facet + + +### Timeline facet + + +### Scatterplot facet + + +### Custom facets: + + + +* Word facet +* Duplicates facet +* Numeric log facet +* Text-length facet + + +### Facet by star or blank or flag + + +## Filtering + + +### Overview + +Applying (case sensitivity; applying multiple in succession), inverting, and removing + + +### Permalink function + + +### Export data function + + (only current view) + + +### Regular expressions + + +## Sort and View + + +### Sort + + +### View: Collapsing (and expanding) + + +### Show/hide “null” + + +### Reordering columns diff --git a/docs/docs/manual/exporters/csv.md b/docs/docs/manual/exporters/csv.md deleted file mode 100644 index 0f9534534..000000000 --- a/docs/docs/manual/exporters/csv.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: csv -title: Exporting to CSV/TSV -sidebar_label: CSV/TSV ---- - - diff --git a/docs/docs/manual/exporters/gsheets.md b/docs/docs/manual/exporters/gsheets.md deleted file mode 100644 index 02d64ca17..000000000 --- a/docs/docs/manual/exporters/gsheets.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: gsheets -title: Exporting to Google Sheets -sidebar_label: Google Sheets ---- - diff --git a/docs/docs/manual/exporters/ods.md b/docs/docs/manual/exporters/ods.md deleted file mode 100644 index b0a488262..000000000 --- a/docs/docs/manual/exporters/ods.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: ods -title: Exporting to ODS -sidebar_label: ODS ---- - diff --git a/docs/docs/manual/exporting.md b/docs/docs/manual/exporting.md new file mode 100644 index 000000000..983be9446 --- /dev/null +++ b/docs/docs/manual/exporting.md @@ -0,0 +1,39 @@ +--- +id: exporting +title: Exporting your work +sidebar_label: Exporting +--- + +## Overview + + +## Export data + +Note you will only export data in the current view - that is, with current filters and facets applied. + + + +* TSV/CSV +* HTML table +* Excel (XLS or XLSX) +* ODF spreadsheet +* Google Sheets \ + +* Custom tabular export +* SQL +* Templating export \ + +* Upload edits to Wikidata +* Export to QuickStatement +* Export Wikidata schema + + +## Export a project + + + +* tar.gz only +* Optional rename +* Local or to Google Drive + * Doesn’t supply a Google Drive link, just gives a confirmation message + * Other user (or you on another computer) will need to download it and save it locally in order to import it \ No newline at end of file diff --git a/docs/docs/manual/expressions.md b/docs/docs/manual/expressions.md new file mode 100644 index 000000000..e732f1d7c --- /dev/null +++ b/docs/docs/manual/expressions.md @@ -0,0 +1,57 @@ +--- + +id: expressions + +title: Expressions + +sidebar_label: Expressions + +--- + + +## Overview + + + +* Tipbox for regexp basics - link to a good guide +* Expression Editor + * Where to find it + + +## GREL (General Refine Expression Language) + + + +* Variables and attributes +* Syntax and controls +* String functions +* Array functions +* Date functions +* Project functions +* Math functions + +_Content from_ + +[https://github.com/OpenRefine/OpenRefine/wiki/General-Refine-Expression-Language](https://github.com/OpenRefine/OpenRefine/wiki/General-Refine-Expression-Language) + +[https://github.com/OpenRefine/OpenRefine/wiki/GREL-Functions](https://github.com/OpenRefine/OpenRefine/wiki/GREL-Functions) + +[https://github.com/OpenRefine/OpenRefine/wiki/GREL-Other-Functions](https://github.com/OpenRefine/OpenRefine/wiki/GREL-Other-Functions) + +etc. + + +## Jython + + + +* Python syntax in OpenRefine +* Installing Python packages + + +## Clojure + + + +* Clojure syntax in OpenRefine +* Using Java packages from Clojure \ No newline at end of file diff --git a/docs/docs/manual/facets/numeric.md b/docs/docs/manual/facets/numeric.md deleted file mode 100644 index 31b30f9c6..000000000 --- a/docs/docs/manual/facets/numeric.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: numeric -title: Numeric Facets -sidebar_label: Numeric ---- - -Numeric facets lets you inspect the distribution of numeric values in a column. diff --git a/docs/docs/manual/facets/scatterplot.md b/docs/docs/manual/facets/scatterplot.md deleted file mode 100644 index 4bba1414a..000000000 --- a/docs/docs/manual/facets/scatterplot.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: scatterplot -title: Scatterplot Facets -sidebar_label: Scatterplot ---- - - diff --git a/docs/docs/manual/facets/text.md b/docs/docs/manual/facets/text.md deleted file mode 100644 index ce7d1b8a5..000000000 --- a/docs/docs/manual/facets/text.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: text -title: Text Facets -sidebar_label: Text ---- - -Text facets list the different values found in a column, with their occurence counts. diff --git a/docs/docs/manual/glossary.md b/docs/docs/manual/glossary.md new file mode 100644 index 000000000..333781973 --- /dev/null +++ b/docs/docs/manual/glossary.md @@ -0,0 +1,5 @@ +--- +id: glossary +title: OpenRefine Glossary +sidebar_label: Glossary +--- diff --git a/docs/docs/manual/grel/cross.md b/docs/docs/manual/grel/cross.md deleted file mode 100644 index a294ea25d..000000000 --- a/docs/docs/manual/grel/cross.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: cross -title: The cross function -sidebar_label: cross ---- - diff --git a/docs/docs/manual/grel/facetCount.md b/docs/docs/manual/grel/facetCount.md deleted file mode 100644 index 2a9f9f669..000000000 --- a/docs/docs/manual/grel/facetCount.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: facetCount -title: The facetCount function -sidebar_label: facetCount ---- - diff --git a/docs/docs/manual/grel/toString.md b/docs/docs/manual/grel/toString.md deleted file mode 100644 index 6dcf338dc..000000000 --- a/docs/docs/manual/grel/toString.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: toString -title: The toString function -sidebar_label: toString ---- - diff --git a/docs/docs/manual/importers/csv.md b/docs/docs/manual/importers/csv.md deleted file mode 100644 index 892d2f5e2..000000000 --- a/docs/docs/manual/importers/csv.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: csv -title: Importing CSV/TSV files -sidebar_label: CSV/TSV ---- - -Comma-Separated Values (CSV) and Tab-Separated Values (TSV) are widespread formats to represent tables. diff --git a/docs/docs/manual/importers/json.md b/docs/docs/manual/importers/json.md deleted file mode 100644 index 5c22df819..000000000 --- a/docs/docs/manual/importers/json.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: json -title: Importing JSON files -sidebar_label: JSON ---- - -JSON (JavaScript Object Notation) is a hierarchical data format commonly used on the Web. diff --git a/docs/docs/manual/importers/xml.md b/docs/docs/manual/importers/xml.md deleted file mode 100644 index 19522989b..000000000 --- a/docs/docs/manual/importers/xml.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: xml -title: Importing XML files -sidebar_label: XML ---- - - diff --git a/docs/docs/manual/install.md b/docs/docs/manual/install.md deleted file mode 100644 index d60a2759d..000000000 --- a/docs/docs/manual/install.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: install -title: Installing OpenRefine -sidebar_label: Installing ---- - -OpenRefine is available for Windows, Mac OS and Linux. The install process depends on the platform. - -# Windows - -# Mac OS - -# Linux - -# Using Docker - - diff --git a/docs/docs/manual/installing.md b/docs/docs/manual/installing.md new file mode 100644 index 000000000..a95cd47be --- /dev/null +++ b/docs/docs/manual/installing.md @@ -0,0 +1,128 @@ +--- +id: installing +title: Installing OpenRefine +sidebar_label: Installing +--- + + +## System requirements + + + +* Java +* Browser + + +### Release versions + + + +* What’s Changed (a plain language summary of major improvements only) +* Layman explainer of beta, RC, and final + * Beta + * Development version + * [Nightly releases](https://github.com/OpenRefine/OpenRefine-nightly-releases/releases) +* [Changelogs feed](https://github.com/OpenRefine/OpenRefine/releases) +* Other distributions + + +## Installing or upgrading + + +### Back up your data + + + +* Windows +* Mac +* Linux + + +### Install/Upgrade + + + +* Windows +* Mac +* Linux + + +### Where is data stored? + + + +* Program directory +* Workspace directory +* Logs (error?) + + +## Increasing memory allocation + + + +* Windows +* Mac +* Linux + + +## Installing extensions + +Extensions have been created by our contributor community to add functionality or provide convenient shortcuts for common uses of OpenRefine. [We list extensions we know about on our downloads page](https://openrefine.org/download.html). + +If you think you’d like to create or modify an extension, [see our developer documentation here](https://github.com/OpenRefine/OpenRefine/wiki/Documentation-For-Developers). If you’re having a problem, [use our downloads page](https://openrefine.org/download.html) to go to the extension’s page and report the issue there. + + +### Two ways to install extensions + +You can install extensions in one of two ways: + + + +* [Into your OpenRefine program folder](installing.md#whereisdatastored), so they will only be available to that version/installation of OpenRefine (meaning the extension will not run if you upgrade OpenRefine), or +* Into your workspace, where your projects are stored, so they will be available no matter which version of OpenRefine you’re using. + +We provide these options because you may wish to reinstall a given extension manually each time you upgrade OpenRefine, in order to be sure it works properly. + + +### Find the right place to install + +If you want to install the extension into the program folder, go to `OpenRefine/webapp/extensions` (or create it if not does not exist). + +If you want to install the extension into your workspace, you can: + + + +* launch OpenRefine and click “Open Project” in the sidebar +* At the bottom of the screen, click “Browse workspace directory” +* A file-explorer window will open in your workspace +* Create a new folder called “extensions” inside the workspace if it does not exist. + +You can also [find your workspace on each operating system using these instructions](installing.md#whereisdatastored). + + +### Install the extension + +Some extensions have their own instructions: make sure you read the documentation before you begin installing. + +Some extensions may have multiple versions, to match OpenRefine versions, so be sure to choose the right release for your installation. If you have questions about compatibility or want to request or voice your support for an update, [use our downloads page](https://openrefine.org/download.html) to go to the extension’s page and report the issue there. + +Generally, the installation process will be: + + + +* Download the extension (usually as a zip file from GitHub) +* Extract the zip contents into the `extensions` directory, making sure all the contents go into one folder with the name of the extension +* Start (or restart) OpenRefine. + +To confirm that installation was a success, follow the instructions provided by the extension. Each extension will appear in its own way inside the OpenRefine interface: make sure you read the documentation to know where the functionality will appear, such as under specific dropdown menus. + + +## Advanced OpenRefine uses + + +### Running as a server + + +### Automating OpenRefine + + diff --git a/docs/docs/manual/operations/key_value_columnize.md b/docs/docs/manual/key_value_columnize.md similarity index 100% rename from docs/docs/manual/operations/key_value_columnize.md rename to docs/docs/manual/key_value_columnize.md diff --git a/docs/docs/manual/operations/add_column.md b/docs/docs/manual/operations/add_column.md deleted file mode 100644 index 09d48a362..000000000 --- a/docs/docs/manual/operations/add_column.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: add_column -title: Add Column Based on This Column -sidebar_label: Add Column ---- - -This operation lets you create a new column, whose values are computed using GREL or another expression language. diff --git a/docs/docs/manual/operations/blank_down.md b/docs/docs/manual/operations/blank_down.md deleted file mode 100644 index 071fc733c..000000000 --- a/docs/docs/manual/operations/blank_down.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: blank_down -title: Blank down -sidebar_label: Blank down ---- - - diff --git a/docs/docs/manual/operations/fill_down.md b/docs/docs/manual/operations/fill_down.md deleted file mode 100644 index a500837c9..000000000 --- a/docs/docs/manual/operations/fill_down.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: fill_down -title: Fill down -sidebar_label: Fill down ---- - - diff --git a/docs/docs/manual/operations/recon.md b/docs/docs/manual/operations/recon.md deleted file mode 100644 index 006fe5eb8..000000000 --- a/docs/docs/manual/operations/recon.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: recon -title: Reconcile -sidebar_label: Reconcile ---- - -Reconciliation is the process of matching names to unique identifiers in third-party databases. diff --git a/docs/docs/manual/operations/transform.md b/docs/docs/manual/operations/transform.md deleted file mode 100644 index cae0bc0dc..000000000 --- a/docs/docs/manual/operations/transform.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: transform -title: Transforming Columns -sidebar_label: Transform ---- - -Transforming a column lets you derive new column values using expressions in GREL or other languages. diff --git a/docs/docs/manual/records_mode.md b/docs/docs/manual/records_mode.md deleted file mode 100644 index e83d2539a..000000000 --- a/docs/docs/manual/records_mode.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -id: records_mode -title: The records mode -sidebar_label: Records mode ---- - - - diff --git a/docs/docs/manual/running.md b/docs/docs/manual/running.md new file mode 100644 index 000000000..ed3b6257d --- /dev/null +++ b/docs/docs/manual/running.md @@ -0,0 +1,124 @@ +--- + +id: running + +title: Running OpenRefine + +sidebar_label: Running + +--- + + +## Starting and exiting + + + +* The window, multiple browser tabs, Ctrl-C, etc. +* Note that it runs offline - your data is private! + + +## The home screen + + + +* Language Settings ( TIP: mention language stays set until changed by user in future) +* Preferences + * Command line options + * INI file options + + +## The project/work screen + +Clicking the diamond (or on “OpenRefine") + + +(Don’t click the browser back button!) + + +### Project title + + +### Open, Export, Help buttons + + +About metadata, Tags, Browse workspace, etc. + + +### The project header + + +Number of selected/ total rows/records, pagination, display rows + + +Rows vs. records + + +### Extensions dropdown + + +### The project grid + +(or The grid, or The grid view, or The data grid, why have I seen so many different names for this) + + +### The project sidebar + + +#### Facet/Filter + + +Permalink + + +#### History (Undo/Redo) + +In OpenRefine, any activity that changes the data can be undone. Changes are tracked from the very beginning, when a project is first created. The undo/redo change history of each project is saved with the project's data, so quitting OpenRefine does not erase the history. When you restart OpenRefine, you can view and undo changes that you made before you quit OpenRefine. + +Project history gets saved when you export a project archive, and restored when you import that archive to a new installation of OpenRefine. + + +![A screenshot of the History (Undo/Redo) tab with 5 steps.](img/history.jpg "A screenshot of the History (Undo/Redo) tab with 5 steps.") + + + +##### Overview + +When you click on “Undo / Redo” in the sidebar of any project, that project’s history is shown as a list of changes in order, with the first "change" being the action of creating the project itself. (That first change, indexed as step zero, cannot be undone.) Here is a sample history with 3 changes: + + +``` + 0. Create project + 1. Remove 7 rows + 2. Create new column Last Name based on column Name by filling 67 rows with grel:value.split(" ")[1] + 3. Split 230 cell(s) in column Address into several columns by separator +``` + + +The current state of the project is highlighted with a dark blue background. If you move back and forth on the **_timeline_** you will see the current state become highlighted, while the actions that came after that state will be grayed out. + +To revert your data back to an earlier state, simply click on the last action in the timeline you want to keep. In the example above, if we keep the removal of 7 rows but revert everything we did after that, then click on "Remove 7 rows." The last 2 changes will be undone, in order to bring the project back to state #1. + +In this example, changes #2 and #3 will now be grayed out. You can redo a change by clicking on it in the history - everything up to and including it will be redone. + +If you have moved back one or more states, and then you perform a new operation on your data, the later actions (everything that’s greyed out) will be erased and cannot be re-applied. + +The Undo/Redo tab will show you which step you’re on, and if you’re about to risk erasing work - by saying something like “4/5" or “1/7” at the end. + + +##### Reusing Operations + +Operations that you perform in OpenRefine can be reused. For example, a formula you wrote inside one project can be copied and applied to another project later. + +To reuse one or more operations, you first extract it from the project where it was first applied. Click to the Undo/Redo tab and click “Extract…”. This brings up a box that lists all operations up to the current state (it does not show undone operations). Select the operation or operations you want to extract using the checkboxes on the left, and they will be encoded as JSON on the right. Copy that JSON off to the clipboard. + +Move to the second project, go to the Undo/Redo tab, click “Apply…” and paste in that JSON. + +_Not all operations can be extracted. Edits to a single cell can’t be replicated._ + + +##### Known Issues + +_If your project history is bigger than 100 MB (output file), Chrome will crash when you try to extract the JSON. Firefox can handle around 200 MB (output file). You may need to disable your spellchecker._ + + +### Common extension buttons diff --git a/docs/docs/manual/starting.md b/docs/docs/manual/starting.md new file mode 100644 index 000000000..02ac27ccf --- /dev/null +++ b/docs/docs/manual/starting.md @@ -0,0 +1,235 @@ +--- + +id: starting + +title: Starting a project + +sidebar_label: Starting a project + +--- + + +## Overview + +OpenRefine doesn’t allow you to create a dataset from nothing - you can only start a project by importing in some existing data. + + + +No matter where you pull in data from, OpenRefine doesn’t modify your original data source. It copies all the information from your input, creates its own project file, and stores it in your [workspace directory](installing.md#whereisdatastored). + +The data and all of your edits are automatically saved inside the project file. When you’re finished modifying the data, you can export it back out into the file format of your choice. + +You can also receive and open other people’s projects, or send them yours, by exporting a project archive and importing it. + + +## Create project by importing data + +When you start OpenRefine, you’ll be taken to the `Create Project` screen. You’ll see on the left side of the screen that your options are to: + + + +* import data from a file on your computer +* import data from a link to the web +* import data by pasting in text from your clipboard +* import data from a database (using SQL), and +* import Sheets from Google Drive. + +From these sources, you can load any of the following file formats: + + + +* comma-separated values (CSV) or text-separated values (TSV) +* Text files +* Fixed-width columns +* JSON +* XML +* ODF spreadsheet (ODS) +* Excel (XLS or XLSX) +* PC-Axis +* MARC +* RDF data (JSON-LD, N3, N-Triples, Turtle, RDF/XML) +* Wikitext + +More formats can be imported by [adding extensions that provide that functionality](https://openrefine.org/download.html). + +For whichever method you choose, when you click `Next >>` you will be given a preview and a chance to configure the way OpenRefine interprets the file. + + +### Methods to import data + + +#### Get data from this computer + +Click on `Browse…` and select a file on your hard drive. All files will be shown, not just compatible ones. + +If you import an archive file (something with the extension `.zip`, `.tar.gz`, `.tgz`, `.tar.bz2`, `.gz`, or `.bz2`), OpenRefine detects the most common file extension in it and loads all files with that extension into a single project. + + +#### Web Addresses (URLs) + +Type or paste the URL to the data file into the field provided. You can add as many fields as you want. OpenRefine will _____(something I haven’t quite figured out yet)______________________. + +Do not use this form to load a Google Sheet by its link; use the Google Data form instead. + + +#### Clipboard + +You can copy and paste in data from anywhere. OpenRefine will recognize comma-separated, tab-separated, or table-formatted information copied from sources such as word-processing documents, spreadsheets, and tables in PDFs. You can also just paste in a list of items that you want to turn into multi-column rows. OpenRefine recognizes each new text line as a row. + +This can be useful if you want to pre-select a specific number of rows from your source data, or paste together rows from different places, rather than delete unwanted rows later in the project interace. + +This can also be useful if you would like to paste in a list of URLs, which you can use later to fetch the data online and build columns with. + + +#### Database (SQL) + +You may want to pull the latest dataset directly from an online database. This could include an online catalogue, a Wordpress or similar content management system, or a [digital repository or collection management system](https://bits.ashleyblewer.com/blog/2017/08/09/collection-management-system-collection/). + +OpenRefine can connect to PostgreSQL, MySQL, MariaDB, and SQLite database systems. It will automatically populate the “Port” field based on which of these you choose, but you can manually edit this if needed. + +To import data directly from a database online, you will need to do two things: + + + +* Add OpenRefine (running from your computer) to an account authorized to access your database +* Set up OpenRefine to access that database using that account + +![A screenshot of connecting to a database](img/databaseconnect.jpg "A screenshot of connecting to a database.") + + +Log in to your hosting provider. Get the database type (such as MySQL), database name, and the URL (either an IP address, such as `127.0.0.1`, or the domain that uses the database, such as _https://openrefine.org/category/blog.html_). Then look at the accounts authorized for access. You may wish to create a new account just for OpenRefine, or add OpenRefine to an existing account. + +Each host will have a slightly different method, but generally speaking: look for “accounts with access” to the database you wish to authorize, and within the settings for that account, look for “allowable hosts” or “access hosts.” + +In that list, add the IP address of your own computer, because that is where the OpenRefine access request will be coming from. You can find this easily, by clicking “Test” within OpenRefine once the rest of the information is filled out: OpenRefine will give you an error that looks like + +``` error:Access denied for user 'yourusername'@'123-45-67-89.yourISP.com' ``` + +Take your IP address from this error message and put that, with periods instead of hyphens, into the “allowable hosts” field on the account you’re trying to use. Add a wildcard to the end of your IP address (“123.45.67.89%”). Save that setting, and then test the connection again with OpenRefine. + +You can either connect just once and gather data, or save the connection to use it again later. If you press “Connect” without saving, OpenRefine will forget all the information you just entered. + +If you’d like to save the connection, name your connection in a way you will recognize later. Click “Save” and it will appear in the “Saved Connections” list on the left. Now, click on the “...” ellipsis to the right of the connection you’ve saved, and click “Connect.” + +If your connection is successful, you will see a Query Editor. From here you can write an [SQL query](https://www.w3schools.com/sql/) to pull the specific data you need. + +If you need help, you may be able to find instructions from your hosting provider. Here are the guides from: + + + +* [Dreamhost](https://help.dreamhost.com/hc/en-us/articles/214883058-How-do-I-connect-to-my-database-using-a-third-party-program-) +* [GoDaddy](https://ca.godaddy.com/help/connect-remotely-to-a-mysql-database-in-my-linux-hosting-account-16103) + + +#### Google Data + +You have two ways to load in data from Google Sheets: + + + +* A link to an accessible Google Sheet (that is, one with link-sharing turned on) +* Selecting a Google Sheet in your Google Drive + + +##### Google Sheet by URL + +You can import data from any Google Sheet that has link-sharing turned on. Paste in a URL that looks something like + +```https://docs.google.com/spreadsheets/……….../edit?usp=sharing``` + +This will only work with Sheets, not with any other Google Drive file that might have an available link. + + +##### Google Sheet from Drive + +You can authorize OpenRefine to access your Google Drive data and import data from any Google Sheet it finds there. This will include Sheets that belong to you and Sheets that are shared with you, as well as Sheets that are in your trash. + +OpenRefine will not show spreadsheets that are in your email inbox or stored in any other Google property - only in Drive. It also won’t show all compatible file formats, only Sheets files. + +OpenRefine will generate a list of all Sheets it finds, with the most recently modified Sheets at the top. If a file you’ve just added isn’t showing in this list, you can close and restart OpenRefine, or simply navigate to an existing project, open it, then head back to the “Create Project” window and check again. + +When you click “Preview” the Sheet will open in a new browser tab. When you click the Sheet title, OpenRefine will begin to process the data. + + +### Previewing the project + +Once OpenRefine is ready to import the data, you will see a screen with “Configure Parsing Options” at the top. You’ll see a preview of the first 100 rows and all identified columns. + +At the bottom of the screen you will find options for telling OpenRefine how to process what it has found. You can tell it which row(s) to parse as column headers, as well as to ignore any number of rows at the top. You can also select a specific range of rows to work with, by discarding some rows at the top (excluding the header) and limiting the total number of rows it loads. + +OpenRefine tries to guess how to parse your data based on the file extension. For example, .xml files are going to be parsed as though they are formatted in XML. An unknown file extension (or your clipboard copy-paste) is assumed to be either tab-separated or comma-separated. OpenRefine looks for a tab character; if one is found, it assumes you have imported tab-separated data. + +If Google isn’t certain what format you imported, it will provide a list of possibilities under “Parse data as” and some settings. You can specify a custom separator now, or split columns later on in the project interface. + +If you imported a spreadsheet with multiple worksheets, they will be listed along with the number of rows they contain. You can only select data from one worksheet. + +Note that OpenRefine does not preserve any formatting, such as cell or text colour, that my have been in the original data file. + +You should create a project name at this stage. You can also supply tags to keep your projects organized. When you’re happy with the preview, click “Create Project.” + + +## Import a project + + +### Overview + +Because OpenRefine only runs locally on your computer, you can’t have a project accessible to more than one person at the same time. + +The best way to collaborate with another person is to export and import projects that save all your changes, so that you can pick up where someone else left off. You can also [export projects](export.md) and import them to new computers of your own, such as for working on the same project from the office and from home. + +An exported project will include all of the [history](interface/projectscreen.md#history), so you can see (and undo) all the changes from the previous user. It is essentially a point-in-time snapshot of their work. OpenRefine only exports projects as `.tar.gz` files at this time. + + +### Instructions + +Once someone has sent you a project archive file from their computer, you can save it anywhere, including your Downloads folder. + +In the left-hand menu of the home screen, click “Import Project.” You will see the following screen: + +![A screenshot of the Import screen](img/import.jpg "A screenshot of the Import screen.") + + +Click “Browse…” and navigate to wherever you saved the file you were sent (for example, your Downloads folder). + +You can rename the project if you’d like - we recommend adding your name, a date, or a version number, if you’re planning to continue collaborating with another person (or working from multiple computers). + +Then, click “Import Project.” Your project should appear with a step count beside “undo/redo” if steps were saved by the exporter. + +OpenRefine will store the project in its own workspace directory, so you can now delete the original file that was sent to you. + + +## Project management + +You can access all of your created projects by clicking on “Open Project.” Your project list can be organized by modification date, title, row count, and other metadata you can supply (such as subject, descripton, tags, or creator). To edit the fields you see here, click “About” to the left of each project. There you can Edit a number of available fields. You can also see the project ID that corresponds to the name of the folder in your work directory. + + +### Naming projects + +You may have multiple projects from the same dataset, or multiple versions from sharing a project with another person. OpenRefine automatically generates a project name from the imported file, or “clipboard” when you use Clipboard importing. Project names don’t have to be unique, so OpenRefine will create many projects with the same name unless you intervene. + +You can name a project when you create it or import it, and you can rename a project by opening it and clicking on the project name at the top of the screen. + + +### Autosaving + +OpenRefine saves all of your actions (everything you can see in the Undo/Redo panel). That includes flagging and starring rows. + +It doesn’t, however, save your facets, filters, or any kind of “view” you may have in place while you work. This includes the number of rows showing, whether you are showing your data as rows or records, and any sorting or column collapsing you may have done. A good rule of thumb is: if it’s not showing in Undo/Redo, you will lose it when you leave the project workspace. + +You can only save and share facets and filters, not any other type of view. To save current facets and filters, click “Permalink.” The project will reload with a different URL, which you can then copy and save elsewhere. This permalink will save both the facets and filters you’ve set, and the settings for each one (such as sorting by count rather than by name). + + +### Deleting projects + +You can delete projects, which will erase the project files from the work directory on your computer. This is immediate and cannot be undone. + + + +Go to “Open Project” and find the project you want to delete. Click on the X to the left of the project name. There will be a confirmation dialog. + + +### Project files + +You can find all of your raw project files in your work directory. They will be named according to the unique Project ID that OpenRefine has assigned them, which you can find on the “Open Project” screen, under the “About” button for each project. + +You can point OpenRefine to use another work directory using [Preferences](running.md#preferences). diff --git a/docs/docs/manual/transforming.md b/docs/docs/manual/transforming.md new file mode 100644 index 000000000..10bdf3747 --- /dev/null +++ b/docs/docs/manual/transforming.md @@ -0,0 +1,118 @@ +--- + +id: transforming + +title: Transforming data + +sidebar_label: Transforming data + +--- + + +# Transforming data + + + +* Permanent “view” changes (not data changes, quite) like rearranging columns, removing columns, and renaming columns. + + +## Edit cells + + +### Overview + + +### Transform + + + +* Transform… +* Common transforms + * Trim / Collapse + * Unescape + * Replace + * Case + * Data type + * To null/empty + + +### Fill down + + +### Blank down + + +### Split multi-valued cells... + + +### Join multi-valued cells... + + +### Cluster and edit... + + +### Replace + + +## Edit column + + +### Overview + + +### Split or Join + + +### Add column based on this column + + +### Add column by fetching URLs + + +### Add columns from reconciled values + + +### Rename or Remove + + +### Move + + +## Transpose + + +### Overview + + +### Transpose cells across columns into rows + + +### Transpose cells in rows into columns + + +### Columnize by key/value columns + + +## Reconcile + + +### Overview + + +### Sources + +[https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources](https://github.com/OpenRefine/OpenRefine/wiki/Reconcilable-Data-Sources) + + +### Functions + + + +* Match each cell to its best candidate +* Create a new item for each cell +* Create one new item for similar cells +* Match all filtered cells +* Discard all reconciliation judgments +* Clear reconciliation data +* Copy reconciliation data +* Use values as identifiers \ No newline at end of file diff --git a/docs/docs/manual/troubleshooting.md b/docs/docs/manual/troubleshooting.md new file mode 100644 index 000000000..49e9e7403 --- /dev/null +++ b/docs/docs/manual/troubleshooting.md @@ -0,0 +1,35 @@ +--- +id: troubleshooting +title: Troubleshooting +sidebar_label: Troubleshooting +--- + +## Frequently Asked Questions + +We collect and share FAQs and responses on Github at [https://github.com/OpenRefine/OpenRefine/wiki/FAQ](https://github.com/OpenRefine/OpenRefine/wiki/FAQ). If you don’t find your problem and solution there, continue on to the resources in the Community section to see more conversations and look for solutions. + + +## Community + +If you’re having a problem: + + + +* Search the [User forum](https://groups.google.com/g/openrefine) to see if the problem is already reported +* Read [Github issues](https://github.com/OpenRefine/OpenRefine/issues) to see if the problem is already reported +* Read [Stack Overflow](https://stackoverflow.com/questions/tagged/openrefine) to see if the problem is already reported +* Check [Twitter](https://twitter.com/search?f=tweets&vertical=default&q=OpenRefine%20OR%20%22Open%20Refine%22%20OR%20%23OpenRefine&src=typd) to see if others are discussing the problem +* Report an issue: + * First as a new thread in the User forum + * Then, if you wish, you can create a Github issue + +If you want to contribute: + + + +* [We have a guide to contributing here.](https://github.com/OpenRefine/OpenRefine/blob/master/CONTRIBUTING.md) +* Contribute your feature requests in the User forum or as Github issues +* Share with us your successes and use cases in the User forum +* Add your blog posts, guides, tips, tricks, tutorials to our list +* Respond to our biennial user survey +* Join the User Forum and/or [Developer Forum](https://groups.google.com/g/openrefine-dev) \ No newline at end of file diff --git a/docs/docs/manual/user_data.md b/docs/docs/manual/user_data.md deleted file mode 100644 index f0175b0a3..000000000 --- a/docs/docs/manual/user_data.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: user_data -title: Backing Up Workspace Data -sidebar_label: Workspace Data ---- - -OpenRefine stores its workspace locally. The exact location depends on the operating system. - -# Windows - -# Mac OS - -# Linux - -# Using Docker - - diff --git a/docs/docs/manual/wikidata.md b/docs/docs/manual/wikidata.md new file mode 100644 index 000000000..4eba40740 --- /dev/null +++ b/docs/docs/manual/wikidata.md @@ -0,0 +1,33 @@ +--- +id: wikidata +title: Wikidata +sidebar_label: Wikidata +--- + +## Overview + + + +* Former extension, now core [but you can remove it]. +* Account required + + +## Features + + + +* Edit Wikidata schema +* Manage Wikidata account +* Import schema +* Export schema +* Uploading edits to Wikidata +* QuickStatements export +* Schema alignment +* Issue detection + + +## More resources + +[https://wdreconcile.toolforge.org/](https://wdreconcile.toolforge.org/) + +[https://www.wikidata.org/wiki/Wikidata:Tools/OpenRefine](https://www.wikidata.org/wiki/Wikidata:Tools/OpenRefine) diff --git a/docs/sidebars.js b/docs/sidebars.js index af50c8148..eca1a52f2 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -1,38 +1,17 @@ module.exports = { docs: { - 'Getting Started': [ + 'User Manual': [ 'index', - 'manual/install', - 'manual/user_data', - 'manual/records_mode' - ], - 'Importing Data': [ - 'manual/importers/csv', - 'manual/importers/json', - 'manual/importers/xml' - ], - 'Operations': [ - 'manual/operations/transform', - 'manual/operations/add_column', - 'manual/operations/fill_down', - 'manual/operations/blank_down', - 'manual/operations/recon', - 'manual/operations/key_value_columnize' - ], - 'Facets': [ - 'manual/facets/text', - 'manual/facets/numeric', - 'manual/facets/scatterplot' - ], - 'Exporters': [ - 'manual/exporters/csv', - 'manual/exporters/gsheets', - 'manual/exporters/ods' - ], - 'GREL': [ - 'manual/grel/cross', - 'manual/grel/facetCount', - 'manual/grel/toString' + 'manual/installing', + 'manual/running', + 'manual/starting', + 'manual/exploring', + 'manual/transforming', + 'manual/expressions', + 'manual/wikidata', + 'manual/exporting', + 'manual/glossary', + 'manual/troubleshooting' ], 'Technical Reference': [ 'tech/architecture', diff --git a/docs/static/img/databaseconnect.jpg b/docs/static/img/databaseconnect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f776b316a828c80d8240c88565973caf76a597b GIT binary patch literal 30632 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/history.jpg b/docs/static/img/history.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17b5124a80b2859cb513f94b773ea12e0592aeb4 GIT binary patch literal 18783 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/import.jpg b/docs/static/img/import.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf50e0d3d6ef44539b6807c8eb49ca0ac4e711e6 GIT binary patch literal 27021 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%0AdIp(YT%u8%= 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 L|CO}Q!}R|HA7pHn literal 0 HcmV?d00001