mirror of
https://github.com/nushell/nushell.git
synced 2024-12-23 07:30:13 +01:00
Split split command to sub commands.
This commit is contained in:
parent
74c2daf665
commit
edbecda14d
@ -279,6 +279,7 @@ pub fn create_default_context(
|
|||||||
whole_stream_command(Autoview),
|
whole_stream_command(Autoview),
|
||||||
whole_stream_command(Table),
|
whole_stream_command(Table),
|
||||||
// Text manipulation
|
// Text manipulation
|
||||||
|
whole_stream_command(Split),
|
||||||
whole_stream_command(SplitColumn),
|
whole_stream_command(SplitColumn),
|
||||||
whole_stream_command(SplitRow),
|
whole_stream_command(SplitRow),
|
||||||
whole_stream_command(Lines),
|
whole_stream_command(Lines),
|
||||||
|
@ -96,9 +96,8 @@ pub(crate) mod skip;
|
|||||||
pub(crate) mod skip_until;
|
pub(crate) mod skip_until;
|
||||||
pub(crate) mod skip_while;
|
pub(crate) mod skip_while;
|
||||||
pub(crate) mod sort_by;
|
pub(crate) mod sort_by;
|
||||||
|
pub(crate) mod split;
|
||||||
pub(crate) mod split_by;
|
pub(crate) mod split_by;
|
||||||
pub(crate) mod split_column;
|
|
||||||
pub(crate) mod split_row;
|
|
||||||
pub(crate) mod sum;
|
pub(crate) mod sum;
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub(crate) mod t_sort_by;
|
pub(crate) mod t_sort_by;
|
||||||
@ -222,9 +221,10 @@ pub(crate) use skip::Skip;
|
|||||||
pub(crate) use skip_until::SkipUntil;
|
pub(crate) use skip_until::SkipUntil;
|
||||||
pub(crate) use skip_while::SkipWhile;
|
pub(crate) use skip_while::SkipWhile;
|
||||||
pub(crate) use sort_by::SortBy;
|
pub(crate) use sort_by::SortBy;
|
||||||
|
pub(crate) use split::Split;
|
||||||
|
pub(crate) use split::SplitColumn;
|
||||||
|
pub(crate) use split::SplitRow;
|
||||||
pub(crate) use split_by::SplitBy;
|
pub(crate) use split_by::SplitBy;
|
||||||
pub(crate) use split_column::SplitColumn;
|
|
||||||
pub(crate) use split_row::SplitRow;
|
|
||||||
pub(crate) use sum::Sum;
|
pub(crate) use sum::Sum;
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
pub(crate) use t_sort_by::TSortBy;
|
pub(crate) use t_sort_by::TSortBy;
|
||||||
|
@ -33,7 +33,7 @@ impl WholeStreamCommand for Headers {
|
|||||||
fn examples(&self) -> Vec<Example> {
|
fn examples(&self) -> Vec<Example> {
|
||||||
vec![Example {
|
vec![Example {
|
||||||
description: "Create headers for a raw string",
|
description: "Create headers for a raw string",
|
||||||
example: r#"echo "a b c|1 2 3" | split-row "|" | split-column " " | headers"#,
|
example: r#"echo "a b c|1 2 3" | split row "|" | split column " " | headers"#,
|
||||||
result: None,
|
result: None,
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
@ -15,15 +15,15 @@ struct SplitColumnArgs {
|
|||||||
collapse_empty: bool,
|
collapse_empty: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SplitColumn;
|
pub struct SubCommand;
|
||||||
|
|
||||||
impl WholeStreamCommand for SplitColumn {
|
impl WholeStreamCommand for SubCommand {
|
||||||
fn name(&self) -> &str {
|
fn name(&self) -> &str {
|
||||||
"split-column"
|
"split column"
|
||||||
}
|
}
|
||||||
|
|
||||||
fn signature(&self) -> Signature {
|
fn signature(&self) -> Signature {
|
||||||
Signature::build("split-column")
|
Signature::build("split column")
|
||||||
.required(
|
.required(
|
||||||
"separator",
|
"separator",
|
||||||
SyntaxShape::Any,
|
SyntaxShape::Any,
|
||||||
@ -34,7 +34,7 @@ impl WholeStreamCommand for SplitColumn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn usage(&self) -> &str {
|
fn usage(&self) -> &str {
|
||||||
"Split row contents across multiple columns via the separator."
|
"splits contents across multiple columns via the separator."
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(
|
fn run(
|
||||||
@ -106,12 +106,12 @@ fn split_column(args: CommandArgs, registry: &CommandRegistry) -> Result<OutputS
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::SplitColumn;
|
use super::SubCommand;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn examples_work_as_expected() {
|
fn examples_work_as_expected() {
|
||||||
use crate::examples::test as test_examples;
|
use crate::examples::test as test_examples;
|
||||||
|
|
||||||
test_examples(SplitColumn {})
|
test_examples(SubCommand {})
|
||||||
}
|
}
|
||||||
}
|
}
|
49
crates/nu-cli/src/commands/split/command.rs
Normal file
49
crates/nu-cli/src/commands/split/command.rs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
use crate::commands::WholeStreamCommand;
|
||||||
|
use crate::prelude::*;
|
||||||
|
use nu_errors::ShellError;
|
||||||
|
use nu_protocol::{ReturnSuccess, Signature, UntaggedValue};
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Command;
|
||||||
|
|
||||||
|
impl WholeStreamCommand for Command {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"split"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn signature(&self) -> Signature {
|
||||||
|
Signature::build("split")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn usage(&self) -> &str {
|
||||||
|
"split contents across desired subcommand (like row, column) via the separator."
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run(
|
||||||
|
&self,
|
||||||
|
_args: CommandArgs,
|
||||||
|
registry: &CommandRegistry,
|
||||||
|
) -> Result<OutputStream, ShellError> {
|
||||||
|
let registry = registry.clone();
|
||||||
|
let stream = async_stream! {
|
||||||
|
yield Ok(ReturnSuccess::Value(
|
||||||
|
UntaggedValue::string(crate::commands::help::get_help(&Command, ®istry))
|
||||||
|
.into_value(Tag::unknown()),
|
||||||
|
));
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(stream.to_output_stream())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::Command;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn examples_work_as_expected() {
|
||||||
|
use crate::examples::test as test_examples;
|
||||||
|
|
||||||
|
test_examples(Command {})
|
||||||
|
}
|
||||||
|
}
|
7
crates/nu-cli/src/commands/split/mod.rs
Normal file
7
crates/nu-cli/src/commands/split/mod.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
pub mod column;
|
||||||
|
pub mod command;
|
||||||
|
pub mod row;
|
||||||
|
|
||||||
|
pub use column::SubCommand as SplitColumn;
|
||||||
|
pub use command::Command as Split;
|
||||||
|
pub use row::SubCommand as SplitRow;
|
@ -10,15 +10,15 @@ struct SplitRowArgs {
|
|||||||
separator: Tagged<String>,
|
separator: Tagged<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SplitRow;
|
pub struct SubCommand;
|
||||||
|
|
||||||
impl WholeStreamCommand for SplitRow {
|
impl WholeStreamCommand for SubCommand {
|
||||||
fn name(&self) -> &str {
|
fn name(&self) -> &str {
|
||||||
"split-row"
|
"split row"
|
||||||
}
|
}
|
||||||
|
|
||||||
fn signature(&self) -> Signature {
|
fn signature(&self) -> Signature {
|
||||||
Signature::build("split-row").required(
|
Signature::build("split row").required(
|
||||||
"separator",
|
"separator",
|
||||||
SyntaxShape::Any,
|
SyntaxShape::Any,
|
||||||
"the character that denotes what separates rows",
|
"the character that denotes what separates rows",
|
||||||
@ -26,7 +26,7 @@ impl WholeStreamCommand for SplitRow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn usage(&self) -> &str {
|
fn usage(&self) -> &str {
|
||||||
"Split row contents over multiple rows via the separator."
|
"splits contents over multiple rows via the separator."
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(
|
fn run(
|
||||||
@ -73,12 +73,12 @@ fn split_row(args: CommandArgs, registry: &CommandRegistry) -> Result<OutputStre
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::SplitRow;
|
use super::SubCommand;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn examples_work_as_expected() {
|
fn examples_work_as_expected() {
|
||||||
use crate::examples::test as test_examples;
|
use crate::examples::test as test_examples;
|
||||||
|
|
||||||
test_examples(SplitRow {})
|
test_examples(SubCommand {})
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -35,7 +35,7 @@ fn condition_is_met() {
|
|||||||
open --raw caballeros.txt
|
open --raw caballeros.txt
|
||||||
| lines
|
| lines
|
||||||
| skip 2
|
| skip 2
|
||||||
| split-column ','
|
| split column ','
|
||||||
| headers
|
| headers
|
||||||
| skip-while "Chickens Collction" != "Blue Chickens"
|
| skip-while "Chickens Collction" != "Blue Chickens"
|
||||||
| keep-until "Chicken Collection" == "Red Chickens"
|
| keep-until "Chicken Collection" == "Red Chickens"
|
||||||
|
@ -35,7 +35,7 @@ fn condition_is_met() {
|
|||||||
open --raw caballeros.txt
|
open --raw caballeros.txt
|
||||||
| lines
|
| lines
|
||||||
| skip 2
|
| skip 2
|
||||||
| split-column ','
|
| split column ','
|
||||||
| headers
|
| headers
|
||||||
| skip 1
|
| skip 1
|
||||||
| keep-while "Chicken Collection" != "Blue Chickens"
|
| keep-while "Chicken Collection" != "Blue Chickens"
|
||||||
|
@ -10,7 +10,7 @@ fn lines() {
|
|||||||
| skip-while $it != "[dependencies]"
|
| skip-while $it != "[dependencies]"
|
||||||
| skip 1
|
| skip 1
|
||||||
| first 1
|
| first 1
|
||||||
| split-column "="
|
| split column "="
|
||||||
| get Column1
|
| get Column1
|
||||||
| trim
|
| trim
|
||||||
| echo $it
|
| echo $it
|
||||||
|
@ -41,6 +41,7 @@ mod skip_until;
|
|||||||
mod sort_by;
|
mod sort_by;
|
||||||
mod split_by;
|
mod split_by;
|
||||||
mod split_column;
|
mod split_column;
|
||||||
|
mod split_row;
|
||||||
mod sum;
|
mod sum;
|
||||||
mod touch;
|
mod touch;
|
||||||
mod trim;
|
mod trim;
|
||||||
|
@ -35,7 +35,7 @@ fn condition_is_met() {
|
|||||||
open --raw caballeros.txt
|
open --raw caballeros.txt
|
||||||
| lines
|
| lines
|
||||||
| skip 2
|
| skip 2
|
||||||
| split-column ','
|
| split column ','
|
||||||
| headers
|
| headers
|
||||||
| skip-until "Chicken Collection" == "Red Chickens"
|
| skip-until "Chicken Collection" == "Red Chickens"
|
||||||
| str "31/04/2020" --to-int
|
| str "31/04/2020" --to-int
|
||||||
|
@ -9,7 +9,7 @@ fn by_column() {
|
|||||||
| lines
|
| lines
|
||||||
| skip 1
|
| skip 1
|
||||||
| first 4
|
| first 4
|
||||||
| split-column "="
|
| split column "="
|
||||||
| sort-by Column1
|
| sort-by Column1
|
||||||
| skip 1
|
| skip 1
|
||||||
| first 1
|
| first 1
|
||||||
|
@ -1,20 +1,30 @@
|
|||||||
|
use nu_test_support::fs::Stub::FileWithContentToBeTrimmed;
|
||||||
|
use nu_test_support::playground::Playground;
|
||||||
use nu_test_support::{nu, pipeline};
|
use nu_test_support::{nu, pipeline};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn by_column() {
|
fn to_column() {
|
||||||
let actual = nu!(
|
Playground::setup("split_column_test_1", |dirs, sandbox| {
|
||||||
cwd: "tests/fixtures/formats", pipeline(
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
||||||
|
"sample.txt",
|
||||||
r#"
|
r#"
|
||||||
open cargo_sample.toml --raw
|
importer,shipper,tariff_item,name,origin
|
||||||
|
"#,
|
||||||
|
)]);
|
||||||
|
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: dirs.test(), pipeline(
|
||||||
|
r#"
|
||||||
|
open sample.txt
|
||||||
| lines
|
| lines
|
||||||
| skip 1
|
|
||||||
| first 1
|
|
||||||
| split-column "="
|
|
||||||
| get Column1
|
|
||||||
| trim
|
| trim
|
||||||
|
| split column ","
|
||||||
|
| pivot
|
||||||
|
| nth 1
|
||||||
| echo $it
|
| echo $it
|
||||||
"#
|
"#
|
||||||
));
|
));
|
||||||
|
|
||||||
assert_eq!(actual.out, "name");
|
assert!(actual.out.contains("shipper"));
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
29
crates/nu-cli/tests/commands/split_row.rs
Normal file
29
crates/nu-cli/tests/commands/split_row.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
use nu_test_support::fs::Stub::FileWithContentToBeTrimmed;
|
||||||
|
use nu_test_support::playground::Playground;
|
||||||
|
use nu_test_support::{nu, pipeline};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn to_row() {
|
||||||
|
Playground::setup("split_row_test_1", |dirs, sandbox| {
|
||||||
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
||||||
|
"sample.txt",
|
||||||
|
r#"
|
||||||
|
importer,shipper,tariff_item,name,origin
|
||||||
|
"#,
|
||||||
|
)]);
|
||||||
|
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: dirs.test(), pipeline(
|
||||||
|
r#"
|
||||||
|
open sample.txt
|
||||||
|
| lines
|
||||||
|
| trim
|
||||||
|
| split row ","
|
||||||
|
| count
|
||||||
|
| echo $it
|
||||||
|
"#
|
||||||
|
));
|
||||||
|
|
||||||
|
assert!(actual.out.contains("5"));
|
||||||
|
})
|
||||||
|
}
|
@ -30,7 +30,7 @@ fn table_to_csv_text() {
|
|||||||
open csv_text_sample.txt
|
open csv_text_sample.txt
|
||||||
| lines
|
| lines
|
||||||
| trim
|
| trim
|
||||||
| split-column "," a b c d origin
|
| split column "," a b c d origin
|
||||||
| last 1
|
| last 1
|
||||||
| to csv
|
| to csv
|
||||||
| lines
|
| lines
|
||||||
@ -63,7 +63,7 @@ fn table_to_csv_text_skipping_headers_after_conversion() {
|
|||||||
open csv_text_sample.txt
|
open csv_text_sample.txt
|
||||||
| lines
|
| lines
|
||||||
| trim
|
| trim
|
||||||
| split-column "," a b c d origin
|
| split column "," a b c d origin
|
||||||
| last 1
|
| last 1
|
||||||
| to csv --headerless
|
| to csv --headerless
|
||||||
| echo $it
|
| echo $it
|
||||||
|
@ -88,7 +88,7 @@ fn table_to_json_text() {
|
|||||||
r#"
|
r#"
|
||||||
open sample.txt
|
open sample.txt
|
||||||
| lines
|
| lines
|
||||||
| split-column "," name luck
|
| split column "," name luck
|
||||||
| select name
|
| select name
|
||||||
| to json
|
| to json
|
||||||
| from json
|
| from json
|
||||||
|
@ -39,7 +39,7 @@ fn table_to_tsv_text() {
|
|||||||
r#"
|
r#"
|
||||||
open tsv_text_sample.txt
|
open tsv_text_sample.txt
|
||||||
| lines
|
| lines
|
||||||
| split-column "\t" a b c d origin
|
| split column "\t" a b c d origin
|
||||||
| last 1
|
| last 1
|
||||||
| to tsv
|
| to tsv
|
||||||
| lines
|
| lines
|
||||||
@ -69,7 +69,7 @@ fn table_to_tsv_text_skipping_headers_after_conversion() {
|
|||||||
r#"
|
r#"
|
||||||
open tsv_text_sample.txt
|
open tsv_text_sample.txt
|
||||||
| lines
|
| lines
|
||||||
| split-column "\t" a b c d origin
|
| split column "\t" a b c d origin
|
||||||
| last 1
|
| last 1
|
||||||
| to tsv --headerless
|
| to tsv --headerless
|
||||||
| echo $it
|
| echo $it
|
||||||
|
@ -312,7 +312,7 @@ pub fn insert_data_at_column_path(
|
|||||||
Ok(original)
|
Ok(original)
|
||||||
} else {
|
} else {
|
||||||
Err(ShellError::untagged_runtime_error(
|
Err(ShellError::untagged_runtime_error(
|
||||||
"Internal error: could not split column-path correctly",
|
"Internal error: could not split column path correctly",
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ Use `rename` to give columns more appropriate names.
|
|||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
> open /etc/passwd | lines | split-column ":" | rename user password uid gid gecos home shell
|
> open /etc/passwd | lines | split column ":" | rename user password uid gid gecos home shell
|
||||||
────┬────────┬──────────┬──────┬──────┬────────┬─────────────────┬──────────────────
|
────┬────────┬──────────┬──────┬──────┬────────┬─────────────────┬──────────────────
|
||||||
# │ user │ password │ uid │ gid │ gecos │ home │ shell
|
# │ user │ password │ uid │ gid │ gecos │ home │ shell
|
||||||
────┼────────┼──────────┼──────┼──────┼────────┼─────────────────┼──────────────────
|
────┼────────┼──────────┼──────┼──────┼────────┼─────────────────┼──────────────────
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# split-column
|
# split column
|
||||||
|
|
||||||
Split row contents across multiple columns via the separator.
|
splits contents across multiple columns via the separator.
|
||||||
|
|
||||||
Syntax: `split-column <separator> ...args{flags}`
|
Syntax: `split column <separator> ...args{flags}`
|
||||||
|
|
||||||
### Parameters
|
### Parameters
|
||||||
|
|
||||||
@ -31,10 +31,10 @@ If we have file structured like this:
|
|||||||
1.0459770114942528 | 1.0925925925925926 | 0.6164383561643836
|
1.0459770114942528 | 1.0925925925925926 | 0.6164383561643836
|
||||||
```
|
```
|
||||||
|
|
||||||
We can build a table from it using the `split-column` command
|
We can build a table from it using the `split column` command
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
> open coordinates.txt | lines | split-column " | "
|
> open coordinates.txt | lines | split column " | "
|
||||||
━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━
|
━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━
|
||||||
# │ Column1 │ Column2 │ Column3
|
# │ Column1 │ Column2 │ Column3
|
||||||
───┼─────────────────────┼──────────────────────┼────────────────────
|
───┼─────────────────────┼──────────────────────┼────────────────────
|
||||||
@ -54,7 +54,7 @@ We can build a table from it using the `split-column` command
|
|||||||
And give names to the columns
|
And give names to the columns
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
> open coordinates.txt | lines | split-column " | " x y z
|
> open coordinates.txt | lines | split column " | " x y z
|
||||||
━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━
|
━━━┯━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━
|
||||||
# │ x │ y │ z
|
# │ x │ y │ z
|
||||||
───┼─────────────────────┼──────────────────────┼────────────────────
|
───┼─────────────────────┼──────────────────────┼────────────────────
|
@ -1,8 +1,8 @@
|
|||||||
# split-row
|
# split row
|
||||||
|
|
||||||
Split row contents over multiple rows via the separator.
|
splits contents over multiple rows via the separator.
|
||||||
|
|
||||||
Syntax: `split-row <separator>`
|
Syntax: `split row <separator>`
|
||||||
|
|
||||||
### Parameters:
|
### Parameters:
|
||||||
* `<separator>` the character that denotes what separates rows
|
* `<separator>` the character that denotes what separates rows
|
||||||
@ -17,10 +17,10 @@ We can build a table from a file that looks like this
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
using the `split-row` command.
|
using the `split row` command.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
open table.txt | split-row ", "
|
open table.txt | split row ", "
|
||||||
━━━┯━━━━━━━━━
|
━━━┯━━━━━━━━━
|
||||||
# │ <value>
|
# │ <value>
|
||||||
───┼─────────
|
───┼─────────
|
Loading…
Reference in New Issue
Block a user