Excel에서 맛있는 CSV 파일을 먹고 쓸모없는 데이터를 배설하지 못하게하려면 어떻게해야합니까?


128

일련 번호로 위젯 판매를 추적하는 데이터베이스가 있습니다. 사용자는 구매자 데이터 및 수량을 입력하고 각 위젯을 사용자 정의 클라이언트 프로그램으로 스캔합니다. 그런 다음 주문을 마무리합니다. 이 모든 것이 완벽하게 작동합니다.

일부 고객은 구매 한 위젯의 Excel 호환 스프레드 시트를 원합니다. 데이터베이스를 쿼리하고 결과를 상점 이름 및 관련 데이터가 포함 된 CSV로 출력하는 PHP 스크립트로이를 생성합니다. 이것도 완벽하게 작동합니다.

메모장이나 vi와 같은 텍스트 편집기에서 열면 파일은 다음과 같습니다.

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

보시다시피, 일련 번호는 존재하지만 (이 경우 모든 2 차 일련 번호가 동일하지는 않습니다) 긴 문자열입니다. 이 파일을 Excel에서 열면 결과는 다음과 같습니다.

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

알다시피, 일련 번호는 큰 따옴표로 묶습니다. Excel은 .csv 파일의 텍스트 한정자를 고려하지 않는 것 같습니다. 이러한 파일을 Access로 가져올 때 어려움이 없습니다. 텍스트로 열면 전혀 문제가 없습니다. 그러나 Excel은 이러한 파일을 쓸모없는 가비지로 변환합니다. 기본 응용 프로그램이 아닌 응용 프로그램으로 CSV 파일을 여는 기술을 최종 사용자에게 알려주는 노력이 점점 어려워지고 있습니다. 희망이 있습니까? 찾을 수없는 설정이 있습니까? 이것은 Excel 2003, 2007 및 2010의 경우와 같습니다.


46
이름만으로 +1을 줄 수 있습니까?
tombull89

11
Excel does not seem to respect text qualifiers in .csv files-큰 따옴표는 텍스트 한정자 가 아니며 데이터에 쉼표를 사용할 수 있습니다. 데이터에 쉼표를 사용하지 않으면 의미없습니다 . 엑셀이 큰 일련 번호는 것으로 만 추측 할 수 있도록 CSV 파일의 모든 데이터는 유형이 지정되지 , 당신은 Excel의에 실행할 때 그건 최대 정밀도 귀하의 번호를 절단되는 것입니다 15 자리의.
DMA57361

1
Excel은 큰 따옴표 안에 모든 쉼표를 사용하지 않는 것 같습니다. "2012 년 8 월 12 일"을 고려해보십시오. Excel도이를 쓰레기로 만듭니다.
zundarz

5
SU 질문 에 대해 언급하고 싶습니다 . Excel에서 CSV를 처리 할 때 어떤 옵션이 있는지 설명합니다.
nixda

1
@nixda 감사합니다! 이는 특히 숙련 된 사용자에게 유용한 제안입니다. 내 문제는 Excel이 자체적으로 .csv 파일과 연결되어 사람들이 아이콘을보고 두 번 클릭 (열기 때문에 열림) 한 다음 저장을 누르기 때문에 거의 인간적인 문제입니다. 그들을 구하기 위해!), 그리고 모든 것이 손실됩니다. 그러나 가능하면 귀하의 방법을 확실히 사용할 것입니다.
atroon

답변:


58

그러나 Excel은 이러한 파일을 쓸모없는 가비지로 변환합니다.

Excel은 쓸모없는 쓰레기입니다.

해결책

Excel 형식의 데이터를 원하는 클라이언트가 소수점 세 자리가없는 "숫자"또는 "텍스트"로 해당 세 열의 표시 형식을 변경할 수없는 경우 약간 놀랐습니다. 그러나 짧은 사용법 문서가 문제가 아니라고 가정 해 봅시다.

옵션은 다음과 같습니다.

  1. 공백이 아닌 숫자가 아닌 숫자를 일련 번호에 넣습니다.
  2. 일부 기본 형식으로 xls 파일 또는 xlsx 파일을 작성하십시오.
  3. 그 숫자를 치우고 수식으로 출력 하십시오 (2 문자를 저장할 ="268435459705526269","",="268435459705526269"수도 있습니다 ="268435459705526269",,="268435459705526269"). 이것은 올바르게 표시되고 일반적으로 유용하지만 미묘하게 손상되는 이점이 있습니다 (수식이므로).

일부 프로그램 (Excel 및 Open Office Calc 포함)은 더 이상 =""필드 내부의 쉼표 를 이스케이프 처리하지 않으므로 옵션 3에주의하십시오 . 즉, ="abc,xyz"두 열에 걸쳐 있고 가져 오기가 중단됩니다.

형식을 사용하면 "=""abc,xy"""이 문제 가 해결되지만이 방법을 사용하면 Excel의 수식 길이 제한 때문에 여전히 255 자로 제한됩니다.


1
실제로, 그것은 가혹하지 않습니다. 위의 숫자 중 하나를 복사하여 Excel에 붙여 넣은 다음 제안 된대로 숫자 형식을 변경하십시오. Excel에서 값이 변경되어 가비지가 발생합니다.
Joe Internet

1
@ 조, 내 초기 개요에 너무 커서. Excel은 실제로 쓰레기를 생성하고 있으며 그 자체가 쓰레기입니다. 이를 반영하여 답변을 업데이트했습니다. 옵션으로는 "Excel csv"가 있고 "사용 가능하고 가치있는 csv"가있을 수 있습니다.
Tyler

2
@ Tyler-Excel이 쓰레기라고 생각하지 않습니다. OP 가이 경우 쓰레기를 생산하고 있다고 옳았습니다. 실제로 우아한 해결책이없는 매우 좋은 질문입니다.
Joe Internet

1
셀 서식 ... 옵션이 제안되었으며 사용하려고했습니다. 이 경우 파일을 여는 순간 Excel은 일련 번호를 과학적 표기법으로 변환하고 (예기치 않은 동의하지 않음) 정밀도를 던지는 것 같습니다. 숫자 나 텍스트로 변경하면 문자열이 다시 나타나지 않습니다. 이것이 바로 문제의 본질입니다. 그래도 수식으로 출력하면 그렇게 할 수 있습니다 ... 나는 생각하지 못했습니다.
atroon

9
@ DMA57361 동작이 예상되지 않습니다. 결정 가능합니다. Excel에서 CSV를 읽는 방법에 대한 수치 정밀도는 잘 문서화되어 있습니다. 경고가없고 데이터를 자동으로 삭제하지 않습니다. 데이터를 가져 오는 방법을 Excel에 알릴 수 없다는 사실도 똑같습니다. 부정성이 필요한가 ? 아니요, 그러나 정직은 최선의 정책이며 이것이 제가 느끼는 방식입니다.
Tyler

42

우리는 3-5와 같은 범위를 포함하는 열이있는 CSV 파일을 가지고 비슷한 문제가 있었고 Excel은 항상 날짜로 변환합니다. 예를 들어 3-5는 3 월 3 일입니다. 숫자로 다시 전환하면 쓸모없는 날짜 정수가되었습니다. 우리는 주변에 도착

  1. CSV에서 TXT 확장으로 이름 바꾸기
  2. 그런 다음 Excel에서 열면 텍스트 가져 오기 마법사에서 시작됩니다.
  3. 마법사의 3 단계 중 3 단계 에서 문제의 열은 텍스트 이며 올바르게 가져 왔습니다.

내가 생각하는 것과 똑같이 할 수 있습니다.

텍스트 가져 오기 마법사

건배


2
올바른 방법으로 +1하십시오. (편집 : 죄송합니다 솔루션을 명확히하기 위해 조금 편집해야했습니다)
jay

2
파일 이름을 바꿀 필요는 없습니다. 가져 오기 마법사를 사용하십시오. Shift- 모든 열을 선택하고 텍스트로 선택하십시오.
nixda

1
텍스트 가져 오기 마법사가 답입니다. 다른 모든 솔루션은 Excel을 사용하여 CSV를보고 편집하는 방법을 이해하지 못해 불필요한 해커입니다.
Excellll

1
@Excellll, 한 번에 하나의 파일로 확인하십시오. 이 프로세스를 자동화 할 때 '필요한 해커'는 종종 하루를 절약합니다.
Parrish Husband

1
표준 사용자가 Excel을 사용하여 CSV 파일을 표시 할 때 이것은 완전히 쓸모가 없습니다. ~ 15 초보자 초보자 사무실 사용자에게 텍스트 가져 오기 마법사를 사용하는 방법을 설명하기 전에 직접 Excel 문서 소스 코드를 입력하고 싶습니다.
northkildonan

8

더 나은 솔루션은 XML 통합 문서를 생성하는 것입니다. 이처럼 :

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

파일 확장자는 .xml이어야합니다. Excel과 OpenOffice가 올바르게 엽니 다.


OP가 데이터베이스를 XML 형식으로 변환하기 위해 PHP 스크립트를 사용해야한다는 것을 의미합니까?
Prasanna

2
Excel에서만 CSV를 이해할 수 있도록 사용자가 Excel에서 .csv를 열거 나 CSV를 엉망으로 만드는 것보다 훨씬 깨끗합니다. 복잡한 스키마조차 아닙니다.
binki

이 표준은 어디에 기록되어 있습니까? 사용 가능한 데이터 유형에 대해 더 알고 싶습니다.
John Doherty

1

내 해결책 : 일련 번호 가져 오기와 동일한 문제가 있습니다. 그것들은 숫자로 취급 될 필요가 없습니다. 즉, 수학 함수가 수행되지 않습니다. 그러나 우리는 그 안에 전체 숫자가 필요합니다. 내가 가진 가장 간단한 것은 일련 번호에 공백을 삽입하는 것입니다. 예 : "12345678 90123456 1234" Excel에서 가져 오면 숫자 대신 텍스트로 처리됩니다.


0

계좌 번호가 길어졌습니다.

이것이 내가 고친 방법입니다.

Libre Office / Open Office에서 file.csv를 열고 (구분 기호 등을 지정해야 할 수도 있음) 파일을 Excel XML 파일로 저장하십시오.

그런 다음 Excel 에서이 파일을 열면 열이 더 이상 과학적 형식으로 변경되지 않습니다. 안전하게 열을 마우스 오른쪽 단추로 클릭하고 형식을 텍스트로 명시 적으로 설정 한 다음 Excel 파일 형식으로 저장하십시오.

Excel 형식 파일을 열면 열이 여전히 정상입니다!


1
이것이 효과 있지만 , 영어를 구사하지 못하는 사람에게 다른 사무실 제품군을 사용해야하는 이유를 설명하려고하면 해결되는만큼 많은 문제가 발생합니다. M $ Office의 대체 소프트웨어는 모두 제 생각에는 좋은 것이지만 모든 사람을 변환 할 수는 없다는 것을 알고 있습니다.
atroon

0

가져 오기 마법사는 일반 사용자 및 일회성 상황에 가장 적합한 솔루션입니다. 프로그래밍 방식의 솔루션이 필요한 경우 QueryTables.Add 메서드 (가져 오기 마법사가 뒤에서 사용하는 방법)를 사용할 수 있습니다.

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.