구조화된 데이터 탐색 및 액세스
누셸의 구조화된 데이터에 대한 강력한 지원을 고려할 때, 더 일반적인 작업 중 일부는 해당 데이터를 탐색하고 액세스하는 것과 관련이 있습니다.
이 섹션의 색인
- 배경 및 정의
- 셀 경로
- 레코드 사용
- 목록 사용
- 테이블 사용
- 샘플 데이터
- 예제 - 테이블 행 액세스
- 예제 - 테이블 열 액세스
- 중첩된 데이터 사용
get
및select
사용- 예제 - 테이블 행과 함께
get
대select
- 예제 - 여러 행과 열이 있는
select
- 예제 - 테이블 행과 함께
- 선택적 연산자를 사용하여 누락된 데이터 처리](#the-optional-operator)
- 공백이 있는 키/열 이름
- 구조화된 데이터 탐색을 위한 기타 명령
배경
아래 예제 및 설명을 위해 구조화된 데이터에 대한 몇 가지 정의를 염두에 두십시오.
- 목록: 목록에는 모든 유형의 0개 이상의 값 시리즈가 포함됩니다. 값이 0개인 목록을 "빈 목록"이라고 합니다.
- 레코드: 레코드에는 0개 이상의 명명된 키와 해당 값 쌍이 포함됩니다. 레코드 값의 데이터는 모든 유형일 수 있습니다. 키-값 쌍이 0개인 레코드를 "빈 레코드"라고 합니다.
- 중첩된 데이터: 목록, 레코드 또는 테이블에 포함된 값은 기본 유형이거나 구조화된 데이터 자체일 수 있습니다. 즉, 데이터는 여러 수준과 여러 형태로 중첩될 수 있습니다.
- 목록 값에는 테이블, 레코드 및 다른 목록도 포함될 수 있습니다.
- 테이블: 테이블은 레코드 목록입니다.
- 레코드 값에는 테이블, 목록 및 다른 레코드가 포함될 수 있습니다.
- 즉, 테이블의 레코드에는 중첩된 테이블, 목록 및 다른 레코드도 포함될 수 있습니다.
- 목록 값에는 테이블, 레코드 및 다른 목록도 포함될 수 있습니다.
팁
테이블은 레코드 목록이므로 목록에서 작동하는 모든 명령이나 구문은 테이블에서도 작동합니다. 그 반대는 반드시 사실이 아닙니다. 테이블에서는 작동하지만 목록에서는 작동하지 않는 일부 명령과 구문이 있습니다.
셀 경로
셀 경로는 구조화된 데이터 내부의 값에 액세스하는 주요 방법입니다. 이 경로는 열에 이름이 있고 행에 번호가 있는 스프레드시트와 유사한 개념을 기반으로 합니다. 셀 경로 이름과 인덱스는 점으로 구분됩니다.
레코드
레코드의 경우 셀 경로는 문자열
인 키의 이름을 지정합니다.
예제 - 레코드 값 액세스:
let my_record = {
a: 5
b: 42
}
$my_record.b + 5
# => 47
목록
목록의 경우 셀 경로는 목록에서 값의 위치(인덱스)를 지정합니다. 이것은 정수
입니다.
예제 - 목록 값 액세스:
목록 인덱스는 0부터 시작한다는 것을 기억하십시오.
let scoobies_list = [ Velma Fred Daphne Shaggy Scooby ]
$scoobies_list.2
# => Daphne
테이블
- 열에 액세스하려면 셀 경로가
문자열
인 열의 이름을 사용합니다. - 행에 액세스하려면
정수
인 행의 인덱스 번호를 사용합니다. - 단일 셀에 액세스하려면 열 이름과 행 인덱스를 조합하여 사용합니다.
다음 몇 가지 예제에서는 다음 테이블을 사용합니다.
let data = [
[date temps condition ];
[2022-02-01T14:30:00+05:00, [38.24, 38.50, 37.99, 37.98, 39.10], 'sunny' ],
[2022-02-02T14:30:00+05:00, [35.24, 35.94, 34.91, 35.24, 36.65], 'sunny' ],
[2022-02-03T14:30:00+05:00, [35.17, 36.67, 34.42, 35.76, 36.52], 'cloudy' ],
[2022-02-04T14:30:00+05:00, [39.24, 40.94, 39.21, 38.99, 38.80], 'rain' ]
]
이 데이터의 시각적 표현을 보려면 확장하십시오.
╭───┬─────────────┬───────────────┬───────────╮
│ # │ date │ temps │ condition │
├───┼─────────────┼───────────────┼───────────┤
│ 0 │ 2 years ago │ ╭───┬───────╮ │ sunny │
│ │ │ │ 0 │ 38.24 │ │ │
│ │ │ │ 1 │ 38.50 │ │ │
│ │ │ │ 2 │ 37.99 │ │ │
│ │ │ │ 3 │ 37.98 │ │ │
│ │ │ │ 4 │ 39.10 │ │ │
│ │ │ ╰───┴───────╯ │ │
│ 1 │ 2 years ago │ ╭───┬───────╮ │ sunny │
│ │ │ │ 0 │ 35.24 │ │ │
│ │ │ │ 1 │ 35.94 │ │ │
│ │ │ │ 2 │ 34.91 │ │ │
│ │ │ │ 3 │ 35.24 │ │ │
│ │ │ │ 4 │ 36.65 │ │ │
│ │ │ ╰───┴───────╯ │ │
│ 2 │ 2 years ago │ ╭───┬───────╮ │ cloudy │
│ │ │ │ 0 │ 35.17 │ │ │
│ │ │ │ 1 │ 36.67 │ │ │
│ │ │ │ 2 │ 34.42 │ │ │
│ │ │ │ 3 │ 35.76 │ │ │
│ │ │ │ 4 │ 36.52 │ │ │
│ │ │ ╰───┴───────╯ │ │
│ 3 │ 2 years ago │ ╭───┬───────╮ │ rain │
│ │ │ │ 0 │ 39.24 │ │ │
│ │ │ │ 1 │ 40.94 │ │ │
│ │ │ │ 2 │ 39.21 │ │ │
│ │ │ │ 3 │ 38.99 │ │ │
│ │ │ │ 4 │ 38.80 │ │ │
│ │ │ ╰───┴───────╯ │ │
╰───┴─────────────┴───────────────┴───────────╯
이것은 세 개의 열이 있는 테이블 형식의 날씨 데이터를 나타냅니다.
- date: 각 날짜에 대한 누셸
date
- temps: 해당 지역의 여러 기상 관측소에서 측정한 5개의
float
값으로 구성된 누셸list
- conditions: 해당 지역의 각 날짜 날씨 상태에 대한 누셸
string
예제 - 테이블 행 액세스(레코드)
두 번째 날짜의 데이터를 레코드로 액세스합니다.
$data.1
# => ╭───────────┬───────────────╮
# => │ date │ 2 years ago │
# => │ │ ╭───┬───────╮ │
# => │ temps │ │ 0 │ 35.24 │ │
# => │ │ │ 1 │ 35.94 │ │
# => │ │ │ 2 │ 34.91 │ │
# => │ │ │ 3 │ 35.24 │ │
# => │ │ │ 4 │ 36.65 │ │
# => │ │ ╰───┴───────╯ │
# => │ condition │ sunny │
# => ╰───────────┴───────────────╯
예제 - 테이블 열 액세스(목록)
$data.condition
# => ╭───┬────────╮
# => │ 0 │ sunny │
# => │ 1 │ sunny │
# => │ 2 │ cloudy │
# => │ 3 │ rain │
# => ╰───┴────────╯
예제 - 테이블 셀 액세스(값)
네 번째 날의 상태:
$data.condition.3
# => rain
중첩된 데이터
데이터는 중첩될 수 있으므로 셀 경로는 여러 이름이나 인덱스에 대한 참조를 포함할 수 있습니다.
예제 - 중첩된 테이블 데이터 액세스
세 번째 날의 두 번째 기상 관측소에서 온도를 얻으려면:
$data.temps.2.1
# => 36.67
첫 번째 인덱스 2
는 세 번째 날에 액세스하고, 다음 인덱스 1
은 두 번째 기상 관측소의 온도 측정값에 액세스합니다.
get
및 select
사용
위에서 사용된 셀 경로 리터럴 구문 외에도 누셸은 셀 경로를 사용하는 몇 가지 명령도 제공합니다. 이 중 가장 중요한 것은 다음과 같습니다.
get
은 셀 경로 리터럴을 사용하는 것과 동일하지만 변수 이름과 표현식을 지원합니다. 위 셀 경로 예제와 마찬가지로get
은 셀 경로로 표시된 값을 반환합니다.select
는 미묘하지만 결정적으로 다릅니다. 값만 반환하는 대신 지정된 데이터 구조 자체를 반환합니다.- 테이블에서
select
를 사용하면 같거나 작은 크기의 테이블이 반환됩니다. - 목록에서
select
를 사용하면 같거나 작은 크기의 목록이 반환됩니다. - 레코드에서
select
를 사용하면 같거나 작은 크기의 레코드가 반환됩니다.
- 테이블에서
위의 샘플 테이블을 계속 사용합니다.
예제 - get
대 select
테이블 행
$data | get 1
# => ╭───────────┬───────────────╮
# => │ date │ 2 years ago │
# => │ │ ╭───┬───────╮ │
# => │ temps │ │ 0 │ 35.24 │ │
# => │ │ │ 1 │ 35.94 │ │
# => │ │ │ 2 │ 34.91 │ │
# => │ │ │ 3 │ 35.24 │ │
# => │ │ │ 4 │ 36.65 │ │
# => │ │ ╰───┴───────╯ │
# => │ condition │ sunny │
# => ╰───────────┴───────────────╯
$data | select 1
# => ╭───┬─────────────┬───────────────┬───────────╮
# => │ # │ date │ temps │ condition │
# => ├───┼─────────────┼───────────────┼───────────┤
# => │ 0 │ 2 years ago │ ╭───┬───────╮ │ sunny │
# => │ │ │ │ 0 │ 35.24 │ │ │
# => │ │ │ │ 1 │ 35.94 │ │ │
# => │ │ │ │ 2 │ 34.91 │ │ │
# => │ │ │ │ 3 │ 35.24 │ │ │
# => │ │ │ │ 4 │ 36.65 │ │ │
# => │ │ │ ╰───┴───────╯ │ │
# => ╰───┴─────────────┴───────────────┴───────────╯
다음을 확인하십시오.
팁
select
에서 반환된 테이블의 행 인덱스는 원본 테이블의 행 인덱스와 동일하지 않습니다. 새 테이블에는 자체 0 기반 인덱스가 있습니다.
원본 인덱스를 얻으려면 enumerate
명령을 사용할 수 있습니다. 예시:
$data | enumerate | select 1
예제 - 여러 행과 열이 있는 select
select
가 새 테이블을 생성하므로 여러 열 이름, 행 인덱스 또는 둘 다를 지정할 수 있습니다. 이 예제는 첫 번째 및 두 번째 행의 날짜 및 상태 열을 포함하는 새 테이블을 만듭니다.
$data | select date condition 0 1
# => ╭───┬─────────────┬───────────╮
# => │ # │ date │ condition │
# => ├───┼─────────────┼───────────┤
# => │ 0 │ 2 years ago │ sunny │
# => │ 1 │ 2 years ago │ sunny │
# => ╰───┴─────────────┴───────────╯
공백이 있는 키/열 이름
키 이름이나 열 이름에 공백이나 다른 문자가 포함되어 있어 일반 단어 문자열로 액세스할 수 없는 경우 키 이름을 따옴표로 묶을 수 있습니다.
예시:
let record_example = {
"key x":12
"key y":4
}
$record_example."key x"
# => 12
# 또는
$record_example | get "key x"
# => 12
키 이름이 숫자 값과 혼동될 수 있는 경우에도 따옴표가 필요합니다.
예시:
let record_example = {
"1": foo
"2": baz
"3": far
}
$record_example."1"
# => foo
이 경우 키 이름을 행 인덱스와 혼동하지 마십시오. 여기서 첫 번째 항목은 키 이름 1
(문자열)에 _할당_됩니다. transpose
명령을 사용하여 테이블로 변환하면 키 1
(문자열)은 행 인덱스 0
(정수)에 있습니다.
누락된 데이터 처리
선택적 연산자
기본적으로 셀 경로 액세스는 요청된 행이나 열에 액세스할 수 없는 경우 실패합니다. 이러한 오류를 억제하려면 셀 경로 멤버에 ?
를 추가하여 선택적으로 표시할 수 있습니다.
예제 - 선택적 연산자
위의 임시 데이터 사용:
let cp: cell-path = $.temps?.1 # temps 열에서 두 번째 위치만 가져옵니다.
# 웁스, temps 열을 제거했습니다.
$data | reject temps | get $cp
기본적으로 누락된 셀은 선택적 연산자를 통해 액세스할 때 null
로 대체됩니다.
누락되거나 null
인 데이터에 대한 default
할당
default
명령을 사용하여 누락되거나 null인 열 결과에 기본값을 적용할 수 있습니다.
let missing_value = [{a:1 b:2} {b:1}]
$missing_value
# => ╭───┬────┬───╮
# => │ # │ a │ b │
# => ├───┼────┼───┤
# => │ 0 │ 1 │ 2 │
# => │ 1 │ ❎ │ 1 │
# => ╰───┴────┴───╯
let with_default_value = ($missing_value | default 'n/a' a)
$with_default_value
# => ╭───┬─────┬───╮
# => │ # │ a │ b │
# => ├───┼─────┼───┤
# => │ 0 │ 1 │ 2 │
# => │ 1 │ n/a │ 1 │
# => ╰───┴─────┴───╯
$with_default_value.1.a
# => n/a