ฉันจะหยุด Excel จากการกินไฟล์ CSV แสนอร่อยของฉันและดึงข้อมูลที่ไร้ประโยชน์ออกมาได้อย่างไร


128

ฉันมีฐานข้อมูลที่ติดตามยอดขายของเครื่องมือตามหมายเลขซีเรียล ผู้ใช้ป้อนข้อมูลและปริมาณของผู้ซื้อและสแกนแต่ละวิดเจ็ตลงในโปรแกรมไคลเอนต์ที่กำหนดเอง จากนั้นพวกเขาก็จบคำสั่ง ทั้งหมดนี้ทำงานได้อย่างไร้ที่ติ

ลูกค้าบางคนต้องการสเปรดชีตที่เข้ากันได้กับ Excel ของวิดเจ็ตที่ซื้อมา เราสร้างสิ่งนี้ด้วยสคริปต์ PHP ซึ่งทำการสืบค้นฐานข้อมูลและแสดงผลลัพธ์เป็น CSV พร้อมชื่อร้านค้าและข้อมูลที่เกี่ยวข้อง มันใช้งานได้ดีอย่างสมบูรณ์เช่นกัน

เมื่อเปิดในตัวแก้ไขข้อความเช่น Notepad หรือ vi ไฟล์จะมีลักษณะดังนี้:

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

อย่างที่คุณเห็นหมายเลขซีเรียลนั้นมีอยู่ (ในกรณีนี้สองครั้งไม่ใช่ serials รองทั้งหมดเหมือนกัน) และเป็นสตริงที่มีความยาว เมื่อเปิดไฟล์นี้ใน 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 สามารถเดาได้ว่าหมายเลขซีเรียลขนาดใหญ่ของคุณเป็นตัวเลขเท่านั้นและนั่นคือเมื่อคุณใช้เพื่อความแม่นยำสูงสุดของ Excel ที่15 หลักซึ่งเป็นสิ่งที่ตัดทอนตัวเลขของคุณ
DMA57361

1
Excel ดูเหมือนจะไม่เคารพคอมม่าทั้งหมดในเครื่องหมายคำพูดคู่ ลองพิจารณา "12 สิงหาคม 2012" Excel จะเปลี่ยนขยะให้เป็นขยะด้วยเช่นกัน
zundarz

5
ฉันต้องการพูดถึงคำถาม SUนี้ มันอธิบายตัวเลือกที่คุณมีเมื่อจัดการกับ CSV ใน Excel
nixda

1
@ nixda ขอบคุณ! นี่เป็นคำแนะนำที่เป็นประโยชน์โดยเฉพาะอย่างยิ่งสำหรับผู้ใช้ที่มีประสบการณ์มากกว่า ปัญหาของฉันเกือบจะเป็นปัญหาของมนุษย์ในการที่ Excel เชื่อมโยงตัวเองกับไฟล์. csv และผู้คนเห็นไอคอนและดับเบิลคลิก (เพราะนั่นคือวิธีที่คุณเปิดสิ่งต่าง ๆ ) และจากนั้นกดบันทึก (เพราะเรามักจะบอกเสมอ พวกเขาเพื่อบันทึก!) และทั้งหมดจะหายไป แต่ฉันจะใช้วิธีการของคุณอย่างแน่นอนเมื่อเป็นไปได้
atroon

คำตอบ:


58

แต่ Excel โดยไม่ล้มเหลวแปลงไฟล์เหล่านี้เป็นขยะที่ไร้ประโยชน์

Excel เป็นขยะที่ไร้ประโยชน์

วิธีการแก้

ฉันจะแปลกใจเล็กน้อยหากลูกค้าที่ต้องการข้อมูลของคุณในรูปแบบ Excel ไม่สามารถเปลี่ยนการจัดรูปแบบที่มองเห็นได้ในคอลัมน์ทั้งสามนั้นเป็น "Number" โดยมีทศนิยมเป็นศูนย์หรือเป็น "ข้อความ" แต่สมมติว่าเอกสารสั้น ๆ ไม่ตรงกับคำถาม

ตัวเลือกของคุณคือ:

  1. โยนอักขระที่ไม่ใช่ตัวเลขไม่ใช่ช่องว่างลงในหมายเลขซีเรียลของคุณ
  2. เขียนไฟล์ xls หรือไฟล์ xlsx ด้วยการจัดรูปแบบเริ่มต้นบางอย่าง
  3. โกงและเอาท์พุทตัวเลขเหล่านั้นเป็นสูตร="268435459705526269","",="268435459705526269"(คุณสามารถ="268435459705526269",,="268435459705526269"บันทึกตัวละครได้ 2 ตัว) สิ่งนี้มีความได้เปรียบในการแสดงอย่างถูกต้องและอาจเป็นประโยชน์โดยทั่วไป แต่จะหักอย่างละเอียด (เนื่องจากเป็นสูตร)

โปรดใช้ความระมัดระวังกับตัวเลือก 3 เนื่องจากบางโปรแกรม (รวมถึง Excel & Open Office Calc) จะไม่ใช้เครื่องหมายจุลภาคใน=""ฟิลด์เป็น Escape อีกต่อไป นั่นหมายความว่า="abc,xyz"จะมีสองคอลัมน์และแบ่งการนำเข้า

การใช้รูปแบบการ"=""abc,xy"""แก้ปัญหานี้ แต่วิธีนี้ยัง จำกัด คุณถึง 255 อักขระเนื่องจากการจำกัดความยาวของสูตรของ Excel


1
จริงๆแล้วมันไม่ได้รุนแรงอะไร คัดลอกและวางหนึ่งในตัวเลขข้างต้นลงใน Excel จากนั้นเปลี่ยนรูปแบบตัวเลขตามที่แนะนำ Excel เปลี่ยนค่าส่งผลให้เกิดขยะ
โจอินเทอร์เน็ต

1
@ โจฉันก็คร่าวๆในภาพรวมเริ่มต้นของฉัน Excel ผลิตขยะอย่างแท้จริงและเป็นขยะเอง ฉันได้อัปเดตคำตอบของฉันเพื่อสะท้อนถึงสิ่งนั้นแล้ว เป็นตัวเลือกที่อาจจะมี "CSV Excel" และยังมี "ใช้งานได้, CSV ที่คุ้มค่า"
ไทเลอร์

2
@ ไทเลอร์ - ฉันไม่คิดว่า Excel เป็นขยะเพียงแค่บอกว่า OP ถูกต้องว่ามันเป็นการผลิตขยะในกรณีนี้ จริงๆแล้วมันเป็นคำถามที่ดีมากโดยไม่มีวิธีแก้ปัญหาที่ดูสง่างาม
Joe Internet

1
แนะนำตัวเลือก Format Cells ... และฉันได้ลองใช้มันแล้ว ในกรณีนี้ทันทีที่คุณเปิดไฟล์ Excel ดูเหมือนจะแปลง serials เป็นโน้ตวิทยาศาสตร์ (ตกลงไม่คาดไม่ถึง) และโยนความแม่นยำ เมื่อคุณเปลี่ยนเป็นตัวเลขหรือข้อความสตริงจะไม่กลับมา นั่นคือแก่นแท้ของปัญหา การแสดงผลเป็นสูตรอาจทำได้แม้ว่า ... ฉันไม่คิดอย่างนั้น
atroon

9
@ DMA57361 ลักษณะการทำงานไม่เป็นไปตามที่คาดหวังไว้ ความแม่นยำของตัวเลขนั้นได้รับการบันทึกไว้อย่างดีว่า Excel อ่าน CSV ได้อย่างไร การขาดคำเตือนและการละทิ้งข้อมูลอย่างเงียบ ๆ นั้นไร้สาระ ความจริงที่ว่าคุณไม่สามารถแม้แต่บอก Excel ถึงวิธีการนำเข้าข้อมูลนั้นไร้สาระอย่างเท่าเทียมกัน การปฏิเสธเป็นสิ่งจำเป็นหรือไม่? ไม่ แต่ความซื่อสัตย์เป็นนโยบายที่ดีที่สุดและนั่นคือสิ่งที่ฉันรู้สึก
Tyler

42

เรามีปัญหาที่คล้ายกันซึ่งเรามีไฟล์ CSV ที่มีคอลัมน์ที่มีช่วงเช่น 3-5 และ Excel จะแปลงเป็นวันที่เช่น 3-5 จะเป็น 3 มีนาคมหลังจากที่สลับกลับไปเป็นตัวเลข เราได้รอบมันโดย

  1. การเปลี่ยนชื่อนามสกุล CSV เป็น TXT
  2. จากนั้นเมื่อเราเปิดมันใน Excel สิ่งนี้จะเริ่มขึ้นในตัวช่วยสร้างการนำเข้าข้อความ
  3. ในขั้นตอนที่ 3 จาก 3 ในตัวช่วยสร้างเราบอกว่าคอลัมน์ที่เป็นปัญหานั้นเป็นข้อความและมีการนำเข้าอย่างถูกต้อง

คุณสามารถทำสิ่งเดียวกันได้ที่นี่ฉันคิดว่า

ตัวช่วยสร้างการนำเข้าข้อความ

ไชโย


2
+1 สำหรับการเป็นวิธีที่ถูกต้องในการทำ (แก้ไข: ขอโทษมีการแก้ไขเล็ก ๆ น้อย ๆ ที่จะชี้แจงวิธีการแก้ปัญหา)
jay

2
คุณไม่ต้องเปลี่ยนชื่อไฟล์ เพียงใช้ตัวช่วยสร้างการนำเข้า Shift- เลือกคอลัมน์ทั้งหมดแล้วเลือกเป็นข้อความ
nixda

1
ตัวช่วยสร้างการนำเข้าข้อความคือคำตอบ โซลูชันอื่น ๆ ทั้งหมดเป็นแฮกเกอร์ที่ไม่มีความจำเป็นซึ่งเกิดจากการไม่เข้าใจวิธีใช้ Excel เพื่อดูและแก้ไข CSV
Excellll

1
@Excellll ให้ทำทีละไฟล์อย่างแน่นอน เมื่อดำเนินกระบวนการนี้โดยอัตโนมัติ 'แฮกเกอร์ที่ไม่มีความจำเป็น' มักจะบันทึกวัน
สามี Parrish

1
สิ่งนี้ไม่มีประโยชน์อย่างสมบูรณ์เมื่อผู้ใช้มาตรฐานใช้ excel เพื่อแสดงไฟล์ CSV ก่อนที่ฉันจะพยายามอธิบายวิธีใช้ text-import-wizard เพื่อ ~ 15 ผู้ใช้งาน office ระดับเริ่มต้นฉันควรจะพิมพ์ source code ของ excel ด้วยตนเอง
northkildonan

8

ทางออกที่ดีกว่าคือการสร้าง XML Workbook แบบนี้:

<?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 ควรใช้สคริปต์ PHP เพื่อแปลงฐานข้อมูลเป็นรูปแบบ XML หรือไม่
Prasanna

2
สะอาดกว่าการให้ผู้ใช้เปิด. csv ใน Excel หรือทำให้ CSV ของคุณสับสนดังนั้น Excel เท่านั้นที่สามารถเข้าใจ CSV ของคุณ มันไม่ได้ซับซ้อนของสคีมา
binki

เอกสารมาตรฐานนี้อยู่ที่ไหน ฉันต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับประเภทข้อมูลที่มีอยู่
John Doherty

1

ทางออกของฉัน: ฉันมีปัญหาเดียวกันกับการนำเข้าหมายเลขซีเรียล พวกเขาไม่จำเป็นต้องได้รับการปฏิบัติเหมือนเป็นตัวเลขนั่นคือไม่มีฟังก์ชันทางคณิตศาสตร์ใด ๆ เกิดขึ้น แต่เราต้องการตัวเลขทั้งหมดในนั้น สิ่งที่ง่ายที่สุดที่ฉันมีคือการแทรกช่องว่างในหมายเลขซีเรียล เช่น "12345678 90123456 1234" เมื่อ Excel นำเข้าจะเป็นข้อความแทนที่จะเป็นตัวเลข


0

ฉันมีหมายเลขบัญชียาวที่อ่านไม่ออก

นี่คือวิธีที่ฉันแก้ไขมัน:

เปิด file.csv ของคุณใน Libre Office / Open Office (คุณอาจต้องระบุตัวคั่น ฯลฯ ) จากนั้นบันทึกไฟล์เป็นไฟล์ 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.