2011-05-02 2 views
3

나는이 질문을 실제로 표현하기에 문제가 있으므로 예제를 제공하려고한다.탭 구분 기호가 데이터베이스에서 오는 경우 탭 구분 파일을 작성하는 방법은 무엇입니까?

다음 코드는 예상되는 결과를 생성하고 각 열이 "실제"탭으로 구분 된 구분 된 파일을 생성한다.

CSV.open(@targetfile, "wb", "\t") { |csv| 
csv << ["row", "of", "CSV", " } 

다음 코드는 예상 한 값을 산출하지 못합니다. 이 경우

CSV.open(@targetfile, "wb", @targetdelimiter) { |csv| 
csv << ["row", "of", "CSV", "data"] } 

@targetdelimiter

는 데이터베이스에서 오는 실제로 사용자가 구성 할 수 있습니다 (따옴표없이) 문자열 '\t'입니다.

이 코드는 구분 된 출력을 생성하지만 "실제"탭 문자 대신 '\t'을 볼 수 있습니다.

db에서 @targetdelimiter='\t'이라는 첫 번째 코드 블록과 동일한 결과를 얻으려면 어떻게해야합니까?

+1

여기서 '\ t'를 "\ t"로 바꾸는 방법을 묻는 것입니다. 그것은 상당히 흥미로운 질문입니다. 나는 그 대답을 즉시 생각할 수 없습니다. – regularfry

답변

7

그냥 보내주세요.

CSV.open(@targetfile, "wb", @targetdelimiter.gsub('\t',"\t")){ |csv| 
csv << ["row", "of", "CSV", "data"] } 
+1

설명에서 빠진 중요한 요소는 @targetdelimiter가 취할 수있는 다른 값입니다. 유효한 값의 범위가 있다고 가정합니다. 그렇지 않으면 이처럼 사소한 접근이 명백합니다. – regularfry

+0

이것은 일반적인 용의자 ',', ';', '', '|' 그리고 어, '/ t'. – steenslag

+0

예, 처리하려면 gsub 호출에서 특정 항목이 필요합니다. – regularfry

1

\t은 첫 번째 예에서 구분 기호로 사용될 때 실제 탭 문자 (ASCII 0x09 또는 Char(9))로 대체됩니다. 두 번째에서는 바뀌지 않고 리터럴 문자 시퀀스 \t으로 사용됩니다. 사용자가 이스케이프 시퀀스를 저장하지 않고 대신 TAB 또는 NEWLINE과 같은 문자를 사용하면 데이터베이스에서 읽고 대신 올바른 문자로 변환 할 수 있습니다 (또는 문자를 변환 할 수 있습니다. 리터럴을 적절한 문자로 변경).

관련 문제