| 
									
										
										
										
											2023-04-22 23:25:24 +00:00
										 |  |  | --- | 
					
						
							|  |  |  | title: Mathematica | 
					
						
							|  |  |  | pagination_prev: demos/cloud/index | 
					
						
							|  |  |  | pagination_next: demos/bigdata/index | 
					
						
							|  |  |  | --- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-27 09:12:19 +00:00
										 |  |  | import current from '/version.js'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-22 23:25:24 +00:00
										 |  |  | :::note | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This demo was last tested in 2023 April 22 in Mathematica 13.2.1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [The "NodeJS" instructions](/docs/getting-started/installation/frameworks) | 
					
						
							|  |  |  | describe installation steps for NodeJS projects.  Mathematica has built-in | 
					
						
							|  |  |  | features for external scripting with NodeJS. Helper functions can translate | 
					
						
							|  |  |  | between CSV text and Mathematica datasets or arrays. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Mathematica can also use [command-line tools](/docs/demos/desktop/cli) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Integration Details
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :::caution | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Mathematica includes `ExternalEvaluate` for running scripts in an external | 
					
						
							|  |  |  | engine.  In local testing, there were incompatibilities with recent NodeJS | 
					
						
							|  |  |  | versions.  This demo uses the shell integration to call a command-line tool. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Command-Line Tools
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `ExternalEvaluate` can run command-line tools and capture standard output: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```mathematica | 
					
						
							|  |  |  | cmd = "/usr/local/bin/xlsx-cli ~/Downloads/pres.numbers" | 
					
						
							|  |  |  | csvdata = ExternalEvaluate["Shell" -> "StandardOutput", cmd]; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Once evaluated, `ImportString` can interpret the data as a dataset.  Typically | 
					
						
							|  |  |  | the first row of the CSV output is the header row.  The `HeaderLines` option | 
					
						
							|  |  |  | controls how Mathematica parses the data: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```mathematica | 
					
						
							|  |  |  | data = ImportString[csvdata, "Dataset", "HeaderLines" -> 1] | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Complete Demo
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :::note | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This demo was tested in macOS.  The path names will differ in other platforms. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1) Create the standalone `xlsx-cli` binary: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-27 09:12:19 +00:00
										 |  |  | <pre><code parentName="pre" {...{"className": "language-bash"}}>{`\ | 
					
						
							| 
									
										
										
										
											2023-04-22 23:25:24 +00:00
										 |  |  | cd /tmp | 
					
						
							| 
									
										
										
										
											2023-04-27 09:12:19 +00:00
										 |  |  | npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz exit-on-epipe commander@2 | 
					
						
							| 
									
										
										
										
											2023-04-22 23:25:24 +00:00
										 |  |  | curl -LO https://docs.sheetjs.com/cli/xlsx-cli.js | 
					
						
							| 
									
										
										
										
											2023-04-27 09:12:19 +00:00
										 |  |  | npx nexe -t 14.15.3 xlsx-cli.js`} | 
					
						
							|  |  |  | </code></pre> | 
					
						
							| 
									
										
										
										
											2023-04-22 23:25:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | This is discussed in ["Command-line Tools"](/docs/demos/desktop/cli) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 2) Move the generated `xlsx-cli` to a fixed location in `/usr/local/bin`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | mkdir -p /usr/local/bin | 
					
						
							|  |  |  | mv xlsx-cli /usr/local/bin/ | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Reading a Local File
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 3) In a new Mathematica notebook, run the following snippet: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```mathematica | 
					
						
							|  |  |  | SheetJSImportFile[x_] := ImportString[Block[{Print}, ExternalEvaluate[ | 
					
						
							|  |  |  |   "Shell" -> "StandardOutput", | 
					
						
							|  |  |  |   "/usr/local/bin/xlsx-cli " <> x | 
					
						
							|  |  |  | ]], "Dataset", "HeaderLines" -> 1] | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 4) Download <https://sheetjs.com/pres.numbers> and save to Downloads folder. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 5) In the Mathematica notebook, run the new function. If the file was saved to | 
					
						
							|  |  |  | the Downloads folder, the path will be `"~/Downloads/pres.numbers"` in macOS: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```mathematica | 
					
						
							|  |  |  | data = SheetJSImportFile["~/Downloads/pres.numbers"] | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The result should be displayed in a concise table. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Reading from a URL
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `FetchURL` downloads a file from a specified URL. This function will be wrapped | 
					
						
							|  |  |  | in a new function called `SheetJSImportURL`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 6) In the same notebook, run the following: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```mathematica | 
					
						
							|  |  |  | Needs["Utilities`URLTools`"]; | 
					
						
							|  |  |  | SheetJSImportURL[x_] := Module[{path},( | 
					
						
							|  |  |  |   path = FetchURL["https://sheetjs.com/pres.numbers"]; | 
					
						
							|  |  |  |   SheetJSImportFile[path] | 
					
						
							|  |  |  | )]; | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 7) Test by downloading the test file in the notebook: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```mathematica | 
					
						
							|  |  |  | data = SheetJSImportURL["https://sheetjs.com/pres.numbers"] | 
					
						
							|  |  |  | ``` |