스프레드 시트의 데이터 구조는 무엇입니까?


35

스프레드 시트 (다른 ​​셀을 참조하는 값 또는 수식이 포함 된 명명 된 또는 식별 된 셀 그룹)가 어떻게 해결되는지 이해하고 싶습니다. 기존 프로젝트를 보려고 시도했지만 GUI, 직렬화, 이벤트 등으로 인해 스프레드 시트를 찾을 수 없었습니다.

가장 간단한 방법은 무엇입니까?


1
당신은 (문제의 고기에서 때문에 덜 산만) 아주 최소한의 GUI를 가지고 스프레드 시트 구현을보고 싶은 경우에, 사우스 캐롤라이나에서보세요 : linuxjournal.com/article/10699?page=0,0을
itsbruce에게

답변:


21

기본적으로 스프레드 시트는 동적 입력과 각 함수 또는 값을 행렬의 셀로 참조 할 수있는 기능적 언어입니다.

대신 같은 것들의 부분은 셀 자체에 배치됩니다.(defn some-name ...)some-name

동적으로 업데이트되는 기능적 언어 아이디어 (예 : clojure 용 lighttable)로 이동하면 스프레드 시트와 동일한 기능을 많이 볼 수 있습니다. 값을 이름에 바인딩하고 해당 값을 사용하는 함수를 작성하고 값을 변경하면 함수의 출력이 즉시 변경됩니다. 이것은 엑셀 =A1 + B2의 위치에 글을 쓰는 것과 같은 일을하는 것과 같습니다 C3.

따라서 기능 프로그래머는 종종 스프레드 시트를 장난감 프로그램으로 작성하고 연구 논문의 주제를 선호합니다. (예, 죄송합니다. 모두 ACM.org Paywall 뒤에 있습니다.)

  • 스프레드 시트 기능 프로그래밍

    함수형 프로그래밍 커뮤니티는 스프레드 시트에 관심을 보였지만 놀랍게도 아무도 Excel과 같은 표준 스프레드 시트를 Haskell과 같은 표준 함수형 프로그래밍 언어로 작동시키는 것을 고려하지 않은 것 같습니다. 이 백서에서는이를 수행 할 수있는 한 가지 방법을 보여줍니다. 우리는 그렇게함으로써 스프레드 시트 프로그래머가 함수형 프로그래밍을 시도 할 수 있기를 바랍니다.

  • Forms / 3 : 스프레드 시트 패러다임의 경계를 탐색하는 1 차 시각 언어

    함수형 프로그래밍을 방해하는 사람들은 종종 함수형 프로그래밍이 대부분의 프로그래머가 이해하고 사용하기에 너무 어렵거나 반 직관적이라고 주장하지만, 그에 대한 증거는 스프레드 시트의 인기를 보면 알 수 있습니다. 함수형 프로그래밍 패러다임의 1 차 부분 집합 인 스프레드 시트 패러다임은 프로그래머와 최종 사용자 모두에게 널리 받아 들여졌습니다. 그러나 대부분의 스프레드 시트 시스템에는 많은 제한이 있습니다. 이 백서에서는 1 차 선언적 평가 모델에서 벗어나지 않고 이러한 제한 사항 중 몇 가지를 제거하는 언어 기능에 대해 설명합니다.

  • 기능 스프레드 시트 구현

    많은 양의 최종 사용자 개발이 스프레드 시트로 수행됩니다. 스프레드 시트 은유는 시각적이고 대화식 실험을 수용하기 때문에 매력적이지만 Peyton Jones, Blackwell 및 Burnett가 관찰 한 것처럼 스프레드 시트 은유는 표현을 명명 된 함수로 변환하는 것과 같은 가장 기본적인 추상화조차 인정하지 않습니다. 따라서 그들은 지정된 입력 및 출력 셀이있는 워크 시트 측면에서 함수를 정의하는 방법을 제안했습니다. 이것을 함수 시트라고 부릅니다.


Wikipedia스프레드 시트 시작 부분에는 스프레드 시트 를 구현하는 방법에 대한 힌트가 있습니다.

스프레드 시트는 테이블 형식의 데이터 구성 및 분석을위한 대화식 컴퓨터 응용 프로그램입니다. 스프레드 시트는 종이 회계 워크 시트의 컴퓨터 시뮬레이션으로 개발되었습니다. 이 프로그램은 배열의 셀로 표현 된 데이터를 행과 열로 구성하여 작동합니다. 배열의 각 셀은 숫자 또는 텍스트 데이터를 포함 할 수있는 모델 뷰 컨트롤러 요소이거나 다른 셀의 내용을 기반으로 값을 자동으로 계산하여 표시하는 수식 결과입니다.

에서이 바탕 자바 라이브러리에 표현 된 Model-View-Controller 패러다임의 개요 . 저자는 애플릿 ('93 -'96에 약간 날짜가 적힌)을 언급하고 http://csis.pace.edu/~bergin/Java/applets.htm (예)으로 가는 그의 웹 페이지를 언급합니다 (예) 해당 스프레드 시트 코드 http://csis.pace.edu/~bergin/Java/Spreadsheet.java에 대한, 애플릿)

나는 스프레드 시트의 전체가 문서를 포함한이 애플릿 570 라인에서 그렇게 크지 않다는 것을 지적 할 것이다.

언어에 따라 희소 배열의 함수 포인터만으로도 모든 작업을 수행 할 수 있습니다.


32

개념적으로 각 셀은 유향 비순환 그래프 의 노드이며 다른 셀에 대한 참조는 해당 그래프에서 가장자리를 만듭니다. 셀을 변경할 때 변경 한 셀에서 도달 할 수있는 모든 노드 의 토폴로지 정렬 은 셀을 평가하는 데 필요한 순서를 제공합니다. 올바른 순서를 결정하면 표준 표현식 파싱입니다.


3
글쎄, 나에게 전화하지만 스프레드 시트에서 사이클을 만들 수 없다는 보장은 없습니다. 실제로 방금 Excel에서 이것을 테스트하여 경고가 표시되었지만 무시하면 순환 참조를 쉽게 만들 수 있습니다.
Doc Brown

1
@DocBrown 루프에 걸리거나 프로그램이 정지되는 것을 방지하기 위해 마지막 링크에서 연결을 끊을 수 있습니다.
이즈 카타

1
좋은 지적, @DocBrown. 재귀를 허용하기로 결정한 경우에도 계산 순서를 위해주기를 감지하고이를 DAG처럼 취급해야합니다. 당신은 그 순서를 여러 번 겪습니다.
Karl Bielefeldt

이러한 종류의 DAG 종속성을 시뮬레이션하기 위해 어떤 데이터 구조를 사용할 수 있습니까? 인접 행렬을 확인하고 있지만 * n 배열을 사용하면 속성을 노드와 가장자리에 연결할 수 없습니다. 예를 들어 셀의 수식은 속성 중 하나입니다.
Andy Dufresne

6

이미 언급했듯이 스프레드 시트는 간단한 해시 또는 사전에 저장된 DAG (directed acyclic graph)로 쉽게 구현됩니다. 간단한 코드를 이해하는 것이 가장 쉬운 방법 일 것입니다.

매우 간단한 파이썬 버전 : http://code.activestate.com/recipes/355045-spreadsheet/

이 블로그 게시물에서 설명하고 상세하게 설명했습니다 : http://ralsina.me/weblog/posts/BB585.html

GUI가있는 간단한 JavaScript 버전도 있습니다 : http://jsfiddle.net/ondras/hYfN3/


0

MS Excel 파일 목적 함수 셀 구조를 Python으로 변환 할 수있는 Python 패키지를 코딩했습니다. XL2py

셀 값은 dict () 유형 오브젝트로 구문 분석되어 해당 값을 추가합니다. 공식에 의해 다른 세포를 언급 한 세포는 노드를 포함한다. 노드는 수식에 의해 값이 정의 된 셀을 나타냅니다. 각 노드 공식에서 순환 참조가 존재하는지 여부를 정의하기 위해 종속성 구조가 정의됩니다. 노드 계산 순서는 관련된 셀 종속성 구조를 고려하여 정의됩니다.

I / O 트리 구조에서, 파이썬에서 원하는대로 최소화 알고리즘 구현을 사용할 수 있습니다.

https://github.com/gusmaogabriels/XL2py를 살펴보십시오.

안부, 가브리엘

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.