2012-02-02 34 views
16

Ngữ nghĩa đằng sau việc sử dụng các từ "dấu phân tách", "trình kết thúc" và "dấu tách" là gì? Ví dụ, tôi tin rằng một terminator sẽ xảy ra sau mỗi mã thông báo và một dấu phân tách giữa mỗi mã thông báo. Là một dấu phân cách giống như một trong số này, hoặc là họ chỉ đơn giản là một hình thức của một dấu phân cách?Khi nào sử dụng các thuật ngữ "dấu phân cách", "terminator" và "dấu phân cách"

SO có tất cả ba dưới dạng thẻ nhưng chúng không phải là từ đồng nghĩa của nhau. Đây có phải là bởi vì tất cả chúng thực sự khác nhau?

Trả lời

11

Về mặt kỹ thuật, dấu phân tách giữa các thứ, có thể để cho bạn biết một trường nào kết thúc và trường khác bắt đầu, chẳng hạn như trong tệp giá trị được phân tách bằng dấu phẩy (CSV).

Một người kết thúc vào cuối điều gì đó, chấm dứt dòng/đầu vào/bất kỳ điều gì.

Dấu phân tách có thể là dấu phân cách hoặc bất kỳ thứ gì khác phân tách mọi thứ. Hãy xem xét khoảng trắng giữa các từ trong tiếng Anh chẳng hạn.

Bạn có thể lập luận rằng một ký tự dòng mới là một trình kết thúc dòng, một dấu tách dòng hoặc một thứ phân tách hai dòng. Vì lý do này, có một vài ký tự kiểu dòng mới khác nhau trong đặc tả Unicode.

+0

Vì vậy, sự khác nhau giữa dấu tách và dấu tách là gì? Lời giải thích của bạn dường như ngụ ý rằng cả hai dấu phẩy trong CSV và dấu cách bằng tiếng Anh đều là dấu phân cách và dấu tách; điều này có đúng không? – musiphil

+0

Có, họ kết thúc có khá nhiều ý nghĩa tương tự. Việc phân tách các chuỗi như trong tệp CSV cho bạn biết giới hạn của dữ liệu ở đâu. Các thuật ngữ tương đương rộng rãi, mặc dù có các hàm ý khác nhau một cách tinh tế. Câu trả lời của Ian Dickinson cung cấp một giải thích hoàn chỉnh hơn về sự khác biệt. – IanGilham

18

Dấu phân cách biểu thị các giới hạn của nội dung nào đó, vị trí bắt đầu và thời điểm kết thúc. Ví dụ:

"this is a string" 

có hai dấu phân tách, cả hai đều là ký tự ngoặc kép. Các dấu phân tách cho biết phần nào của sự vật, và cái gì không.

Một tách phân biệt hai điều trong một chuỗi:

one, two 
1\t2 
code(); // comment 

Vai trò của thiết bị tách là để phân ranh giới hai thực thể riêng biệt để họ có thể phân biệt. (Lưu ý rằng tôi nói "hai" vì trong khoa học máy tính, chúng ta thường nói về việc xử lý chuỗi ký tự tuyến tính).

Trình kết thúc chỉ báo kết thúc chuỗi. Trong một CSV, bạn có thể nghĩ về dòng mới như chấm dứt bản ghi trên một dòng, hoặc khi tách một bản ghi khỏi bản ghi kế tiếp.

ranh giới Mã thường được biểu hiện bằng một sự thay đổi trong các lớp học cú pháp:

foo() 

có khả năng sẽ được tokenised như word(foo), lparen, rparen - không có bất kỳ delimiters rõ ràng giữa các thẻ, nhưng một tokenizer sẽ nhận ra sự thay đổi trong các lớp ngữ pháp giữa các ký tự dấu chấm câu và dấu chấm câu.

Danh mục không hoàn toàn khác biệt. Ví dụ:

[red, green, blue] 

có thể (tùy thuộc vào cú pháp của bạn) là danh sách ba mục; các dấu ngoặc phân cách danh sách và khung bên phải chấm dứt danh sách và đánh dấu phần cuối của mã thông báo blue.

Vì việc SO sử dụng các thuật ngữ đó làm thẻ, chúng chỉ là: thẻ để chỉ ra chủ đề của câu hỏi. Không có một từ vựng được kiểm soát thống nhất duy nhất cho các thẻ; bất cứ ai có đủ nghiệp lực đều có thể thêm một thẻ mới. Có đủ khác biệt về thuật ngữ tồn tại mà bạn không bao giờ có thể có một từ khóa thẻ được kiểm soát duy nhất trên tất cả các chủ đề mà SO đề cập.

+0

Định nghĩa "dấu phân tách" này không nhất quán với [Wikipedia] (https://en.wikipedia.org/wiki/Delimiter). Ở đó, một "dấu phân cách" khá nhiều bao hàm những gì bạn gọi là "dấu tách". –

0

Câu hỏi và câu trả lời thú vị. Để tóm tắt, 1) dấu phân cách đánh dấu "giới hạn" của một cái gì đó, tức là bắt đầu và/hoặc kết thúc; 2) terminator chỉ là một thuật ngữ đặc biệt cho "dấu phân cách kết thúc"; 3) dấu phân cách đòi hỏi có các mục trên cả hai mặt của nó (không giống như dấu phân tách).

Ví dụ tốt nhất mà tôi có thể nghĩ đến cho dấu phân cách bắt đầu là dấu đánh dấu bắt đầu bằng ngôn ngữ lập trình ("#", "//", v.v.).

Ví dụ tốt nhất mà tôi có thể nghĩ đến cho một trình kết thúc (dấu phân cách cuối) là ký tự dòng mới trong Unix. Đó là từ sai - nó luôn luôn chấm dứt một dòng (có thể trống) nhưng không phải lúc nào cũng bắt đầu một dòng mới, tức là khi nó là ký tự cuối cùng trong một tệp. Có lẽ một ví dụ phổ biến hơn là khoảng thời gian đơn giản cho câu.

Ví dụ tốt nhất mà tôi có thể nghĩ về dấu tách là dấu phẩy đơn giản. Lưu ý rằng dấu phẩy không bao giờ xuất hiện bằng tiếng Anh mà không có văn bản cả trước và sau đó.

Điều thú vị cần lưu ý là không có điều nào trong số này nhất thiết bị giới hạn ở một ký tự. Trong thực tế awk (hoặc có thể chỉ gawk?) Trong Unix cho phép FS (phân cách trường) được bất kỳ regexp.

Ngoài ra, mặc dù "bất kỳ khoảng trắng khác nào" được coi là "dấu phân tách từ", ví dụ: lệnh wc, cũng có các chỉ số "ranh giới từ" không có chiều rộng bằng không trong regexps (ví dụ: \ b). Thú vị để suy nghĩ xem các mặt hàng/chiều rộng không có chiều rộng đó có thể được coi là "dấu phân tách" hay không. Tôi có xu hướng nghĩ rằng không (quá nhiều của một căng).

0

Terminators là dấu phân tách khi bạn bắt đầu rỗng. A; B; C; thực sự là A; B; C; trống rỗng.

0

Phản hồi này nằm trong ngữ cảnh của CSV vì tất cả câu trả lời được cung cấp tập trung vào ngôn ngữ tiếng Anh để thay thế.

ký tự phân cách là những yếu tố được đề cập trong đặc điểm kỹ thuật CSV cho rằng mô tả ranh giới của các công cụ, tách là một tên gọi chung cho delimiters lĩnh vực, Terminators là một tên gọi chung cho delimiters kỷ lục.


Dấu phân tách là một phần của đặc tả định dạng CSV, nó xác định ranh giới và không phải là ký tự có thể in.

Dấu phân tách, dấu phân tách và dấu phân cách trường là dấu phân tách nhưng không cần thiết để chỉ định định dạng CSV, ví dụ: 50 cột phân cách có nghĩa là mỗi 50 cột là một giá trị - ký tự từ 0-49 trong mỗi dòng (thường được lấp đầy với khoảng trắng) là giá trị của trường 0 và các ký tự từ 50-99 là giá trị của trường1, v.v.

Terminator là một dấu phân cách thường được biểu diễn bằng Nguồn cấp dữ liệu (LF), Trả về vận chuyển (CR) hoặc kết hợp (ví dụ: CRLF) và đánh dấu phần cuối của bản ghi CSV đơn.

Dấu phân tách là dấu tách được biểu thị bằng ký tự được in (ví dụ: dấu chấm phẩy) và đánh dấu sự phân chia giữa các trường CSV, nó đã được giới thiệu để lưu trữ giá trị độ dài động. Thông số định dạng CSV không có dấu phân tách thường có độ dài trường không đổi.

Dấu phân cách trường thường được sử dụng theo cặp thay vì chuỗi thoát, nó là ký tự có thể in không được phép trong giá trị trường (trừ khi đặc tả định dạng CSV đã cung cấp trình tự thoát) và đánh dấu phần đầu và cuối của một trường, nó đã được giới thiệu để lưu trữ các giá trị có chứa dấu tách.

Trình tự thoát là ký tự (hoặc tập hợp các ký tự) đánh dấu bất kỳ thứ gì sau chuỗi thoát là không quan trọng và do đó là một phần của giá trị trường (ví dụ: dấu gạch chéo ngược có thể xác định dấu tách sau ngay lập tức như một phần của giá trị). Chuỗi này có thể thoát ra một hoặc nhiều ký tự.

1

A dấu phân tách là một hoặc hai điểm đánh dấu hiển thị phần bắt đầu và kết thúc của nội dung nào đó. Chúng cần thiết bởi vì chúng ta không biết 'cái gì đó' sẽ kéo dài bao lâu. Chúng ta có thể có một trong hai: 1. một đơn delimiter, hoặc 2. một cặp cặp delimiters

  • [a, b, c, d, e] mỗi dấu phẩy (,) là một đơn delimiter. Dấu ngoặc trái và phải, ([, ]) là cặp phân tách.
  • "hello", hai biểu tượng quote (") là cặp delimiters

Một seperator là một từ đồng nghĩa của một "delimiter", nhưng từ kinh nghiệm của tôi nó thường dùng để chỉ lĩnh vực delimiters. Dấu phân tách trường hoạt động như một dải phân cách giữa một trường và một trường theo sau, đó là lý do tại sao có thể được coi là "tách" chúng.

  • <file1>␜<file2>␜<file3>, nhân vật tập tin phân cách (), mặc dù rõ ràng tên có "tách", vừa là một delimiter và thiết bị tách

Một terminator dấu kết thúc một nhóm những thứ, một lần nữa cần thiết bởi vì chúng ta không biết nó kéo dài bao lâu.

  • abdefa\0, ở đây các ký tự null \0 là một terminator cho chúng ta biết các chuỗi đã kết thúc.
  • foo\n, tại đây ký tự dòng mới \nterminator cho chúng ta biết dòng đã kết thúc.

Các thuật ngữ, dấu phân cách, tách bắt nguồn từ ý tưởng cổ điển dung lượng lưu trữ, khái niệm, được bao gồm file, hồ sơ, và các lĩnh vực, (một tập tin có nhiều hồ sơ, một kỷ lục có nhiều lĩnh vực) . Trong ngữ cảnh này, một dấu phân tách đơn và dấu phân tách kép có thể được gọi là các dấu phân tách bản ghidấu phân tách trường. Vì ý nghĩa lịch sử của phân loại hồ sơ-ghi-lĩnh vực, thuật ngữ này có một cách sử dụng rộng rãi hơn (xem trang Wikipedia cho Delimiter).

  • Dưới đây là hai tác phẩm, mỗi với ba hồ sơ với mỗi bản ghi có bốn lĩnh vực:

    martin,rodgers,33,28000\n 
    timothy,byrd,22,25000\n 
    marion,summers,35,37000\n 
    === 
    lucille,rowe,28,33000\n 
    whitney,turner,24,19000\n 
    fernando,simpson,35,40900\n 
    

    Ở đây, ,\n như chúng ta biết là delimiters duy nhất, nhưng họ cũng có thể được gọi là một bản ghi phân cáchdấu phân tách trường tương ứng.


Đối với cấu trúc lồng nhau phức tạp, một terminator cũng có thể là một dấu phân cách/tách (họ không định nghĩa loại trừ lẫn nhau). Từ ví dụ trước, mã đánh dấu === từ bên trong một tệp có thể được coi là một trình kết thúc (là phần cuối của tệp). Nhưng khi chúng ta xem xét nhiều tệp, các hành vi === giống như dấu phân cách/dấu tách.

  • xem xét dòng trong một tập tin UNIX

    This is line 1\n 
    This is line 2\n 
    This is line 3\n 
    

    Các dòng mới đều Terminators (họ cho chúng tôi biết chuỗi kết thúc) và delimiters (họ cho chúng tôi biết mỗi dòng bắt đầu và kết thúc). Từ Wikipedia:

    Hai cách để xem dòng mới, cả hai cách đều là tự nhất quán, là dòng mới có dòng riêng biệt hay là chúng chấm dứt dòng.

Thật bạn sẽ chỉ cần nói "terminator" khi bạn đang nói chuyện cùng một mục cá nhân, (chỉ là một chuỗi 1234\0, chỉ cần một dòng abcd\n, vv) - và nó sẽ không rõ liệu trình kết thúc trong ngữ cảnh này cũng có thể là dấu phân tách trong cấu trúc cha phức tạp hơn không.

0

"từ 1", "lời 2" \ NULL

  1. Các từ được giới hạn bởi dấu ngoặc kép,
  2. phân cách bằng dấu phẩy,
  3. và toàn bộ điều bị chấm dứt bởi \ NULL.
Các vấn đề liên quan