당신을 놀라게 할 코딩 이유 때문에 (말하기에는 너무 부끄럽습니다) 여러 텍스트 항목을 단일 문자열에 저장해야합니다.
문자를 사용하여 구분하겠습니다.
이를 위해 어떤 문자를 사용하는 것이 가장 좋습니까? 즉, 텍스트에 나타날 가능성이 가장 적은 문자는 무엇입니까? 로케일 문제를 방지하려면 인쇄 가능해야하며 ASCII에서 128 미만이어야합니다.
당신을 놀라게 할 코딩 이유 때문에 (말하기에는 너무 부끄럽습니다) 여러 텍스트 항목을 단일 문자열에 저장해야합니다.
문자를 사용하여 구분하겠습니다.
이를 위해 어떤 문자를 사용하는 것이 가장 좋습니까? 즉, 텍스트에 나타날 가능성이 가장 적은 문자는 무엇입니까? 로케일 문제를 방지하려면 인쇄 가능해야하며 ASCII에서 128 미만이어야합니다.
|
텍스트에 a가있을 수있는 사람들을 위해 실제로 문자를 가능한 한 최소화해야하는 경우가있었습니다. 흥미로운 텍스트가있는 문자열이있는 대부분의 필드 때문에 CSV는 많은 이스케이프로 인해 작동하지 않았습니다. 필드 구분자는입니다 /|
. 슬래시는 적당히 흔하지 만 결코 만나지 않는 파이프와 쌍을 이룹니다. 나는 매일 많은 데이터를 전달받는 엔진을 사용하고 있습니다. 이것은 결코 깨지지 않았으며 단일 문자열을 캡슐화하거나 특수 문자를 이스케이프 할 필요가 없습니다. 평균적으로이 메커니즘은 텍스트의 몇 퍼센트를 절약했습니다.
답변:
당황스러운 이유로 CSV를 사용할 수 없다고 가정하면 데이터를 사용한다고 말하고 싶습니다. 샘플 데이터를 가져와 각 값 0-127에 대해 간단한 문자 수를 계산합니다. 발생하지 않는 것 중 하나를 선택하십시오. 선택의 여지가 너무 많으면 더 큰 데이터 세트를 얻으십시오. 글을 쓰는 데 많은 시간이 걸리지 않으며 가장 적합한 답변을 얻을 수 있습니다.
문제 영역에 따라 대답이 달라 지므로 | (파이프)는 셸 스크립트에서 일반적이고 ^는 수학 공식에서 일반적이며 대부분의 다른 문자에서도 마찬가지입니다.
나는 개인적으로 내가 갈 것이라고 생각한다 | (파이프) 선택권이 주어지면 실제 데이터를 사용하는 것이 가장 안전합니다.
그리고 무엇을하든 탈출 계획을 세웠는지 확인하십시오!
additional_attributes
.
\t
구분 기호로 탭 문자 를 사용하지 않는 이유는 무엇 입니까?
"Unit Separator"ASCII 코드 "US"를 선택합니다 : ASCII 31 (0x1F)
예전에는 대부분의 작업이 무작위 액세스없이 연속적으로 수행되었습니다. 이것은 몇 가지 제어 코드가 ASCII에 포함되었음을 의미합니다.
ASCII 28 (0x1C) File Separator - Used to indicate separation between files on a data input stream.
ASCII 29 (0x1D) Group Separator - Used to indicate separation between tables on a data input stream (called groups back then).
ASCII 30 (0x1E) Record Separator - Used to indicate separation between records within a table (within a group). These roughly map to a tuple in modern nomenclature.
ASCII 31 (0x1F) Unit Separator - Used to indicate separation between units within a record. The roughly map to fields in modern nomenclature.
Unit Separator는 ASCII 형식이며이를 표시하기위한 유니 코드 지원 (일반적으로 동일한 글리프의 "us")이 있지만 많은 글꼴에서 표시하지 않습니다.
표시해야하는 경우 필드로 구문 분석 된 후 응용 프로그램에 표시하는 것이 좋습니다.
다른 언어를 사용하는 경우이 기호 : ¬
최고로 입증되었습니다. 그러나 나는 여전히 테스트 중입니다.
"인쇄 가능"이라고 말했지만 탭 (0x09) 또는 용지 공급 (0x0c)과 같은 문자를 포함 할 수 있습니다. 쉼표가 때때로 텍스트에 나타날 수 있기 때문에 나는 거의 항상 쉼표 대신 탭을 선택합니다.
(흥미롭게도 ascii 테이블 에는 그룹, 레코드 및 단위 구분 기호에 대해 GS (0x1D), RS (0x1E) 및 US (0x1F) 문자가 있습니다.
"인쇄 가능"이란 사용자가 인식하고 쉽게 입력 할 수있는 문자를 의미하는 경우 파이프 | 기호 먼저, 몇 가지 다른 이상한 문자 ( @
또는 ~
또는 ^
또는 또는 \
여기에 입력 할 수없는 백틱)를 가능성으로 사용합니다. 이러한 문자 +=!$%&*()-'":;<>,.?/
는 사용자 입력에서 발생할 가능성이 더 높은 것처럼 보입니다. 밑줄 _
과 해시 #
와 {}[]
내가 모르는 괄호에 관해서는 .
28 FS
파일 구분, 29 GS
그룹 구분, 30 RS
기록 구분, 31 US
단위 구분. 불행히도, 그것이 정확히 의도 된 것이지만 거의 아무도 사용하지 않습니다. 개인적으로 저는 CSV 형식 파일을 싫어합니다. 왜냐하면 너무 많은 사람들이 생각하지 않고 프로그래머가 파일 형식을 지원하려면 처리해야하는 엉망이되기 때문입니다.
CSV 스타일 형식을 사용하는 것은 어떻습니까? 문자는 표준 CSV 형식으로 이스케이프 될 수 있으며 이미 많은 파서가 작성되어 있습니다.
빠른 이스케이프를 위해 다음과 같은 것을 사용합니다. str1, str2 및 str3을 연결하고 싶다고 가정 해 보겠습니다.
delimitedStr=str1.Replace("@","@a").Replace("|","@p")+"|"+str2.Replace("@","@a").Replace("|","@p")+"|"+str3.Replace("@","@a").Replace("|","@p");
그런 다음 원래 사용을 검색하려면 :
splitStr=delimitedStr.Split("|".ToCharArray());
str1=splitStr[0].Replace("@p","|").Replace("@a","@");
str2=splitStr[1].Replace("@p","|").Replace("@a","@");
str3=splitStr[2].Replace("@p","|").Replace("@a","@");
참고 : 교체 순서가 중요합니다.
깨지지 않고 구현하기 쉽습니다.
상황과 언어에 따라 좋을 수도 있고 나쁠 수도 있지만 (일반적으로 나쁠 수도 있지만) 항상 모든 것을 Base64로 인코딩 할 수 있습니다. 그런 다음 각 측면에서 다양한 패턴을 이스케이프 및 이스케이프 해제하는 것에 대해 걱정할 필요가 없으며 Base64 문자 집합에서 사용되지 않는 문자를 기반으로 문자열을 간단히 분리하고 분할 할 수 있습니다.
XML 문서를 XML 속성 / 노드에 넣을 때이 솔루션에 의존해야했습니다. 속성에는 CDATA 블록이 전혀 포함될 수 없으며 CDATA로 이스케이프 된 노드는 구조를 깨지 않고는 그 내부에 추가 CDATA 블록을 가질 수 없습니다.
하지만 CSV는 대부분의 상황에서 더 나은 아이디어 일 것입니다.
자연 텍스트에서 앰퍼샌드 다음에 쉼표가 오는 것을 본 적이 없다고 생각하지만 먼저 파일에 구분 기호가 포함되어 있는지 확인하고 그렇다면 대체를 사용할 수 있습니다. 사용하는 구분 기호가 충돌을 일으키지 않는다는 것을 항상 알고 싶다면 원하는 구분 기호가 있는지 파일을 확인하는 루프를 수행하고 존재하는 경우 파일이 더 이상 일치하지 않을 때까지 문자열을 두 배로 늘립니다. . 프로그램이 정확한 구분 기호 일치 만 검색하므로 유사한 문자열이 있는지 여부는 중요하지 않습니다.