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-05-07 13:58:36 +00:00
|
|
|
import CodeBlock from '@theme/CodeBlock';
|
2023-04-27 09:12:19 +00:00
|
|
|
|
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-05-07 13:58:36 +00:00
|
|
|
<CodeBlock 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`}
|
2023-05-07 13:58:36 +00:00
|
|
|
</CodeBlock>
|
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"]
|
|
|
|
```
|