2011-12-01 9 views
16

मैं सीओपीवाई का उपयोग कर PostgreSQL में एक CSV फ़ाइल आयात करने की कोशिश कर रहा हूं। यह चुटकुले करता है जब यह एक पंक्ति को हिट करता है जहां रिक्त मूल्य होते हैं, उदा। नीचे दूसरी पंक्ति:सीएसवी से पोस्टग्रेएसक्यूएल प्रतिलिपि डेटा मूल्यों के साथ

JAN-01-2001,1,2,3,4,5

JAN-02-2001,6,7,,,

मैं इस कॉपी बयान की कोशिश की है, साथ ही शून्य का उपयोग कर वेरिएंट और उद्धरण और havent कुछ भी है कि काम करता है पाया।

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;

कोई सुझाव? डेटा फ़ाइल एक विशाल 22 जीबी फ्लैट फ़ाइल में है, इसलिए मैं इसे सीधे संपादित करने से बचना चाहता हूं।

+2

और त्रुटि है? –

+1

यह पूरी कहानी नहीं है। [दस्तावेज़ीकरण] के अनुसार (http://www.postgresql.org/docs/8.3/static/sql-copy.html) और उपरोक्त मेरा चेक किसी भी आधुनिक PostgreSQL (सीएसवी मोड में कोई उद्धरण के साथ खाली मूल्य) के तहत अच्छी तरह से काम करता है। हो सकता है कि आपके पास अल्प संशोधक या अल्पविराम की अमान्य संख्या न हो? –

+0

त्रुटि: प्रकार संख्यात्मक के लिए अमान्य इनपुट वाक्यविन्यास: CONTEXT: कॉपी डेटा, लाइन 13, कॉलम अंतराल_2400: – ugh

उत्तर

2

मैं आपके आयात के प्रयोजनों के लिए अपने संख्यात्मक कॉलम को टेक्स्ट कॉलम में बदलने का सुझाव दूंगा। कारण यह है कि एक खाली स्ट्रिंग मान्य संख्यात्मक मान नहीं है। अपने संख्यात्मक कॉलम को टेक्स्ट कॉलम में बदलें, सीएसवी फ़ाइल आयात करें, रिक्त मान को शून्य या 0 पर अपडेट करें, और उसके बाद कॉलम को पूर्णांक में बदलें।

+0

सीएसवी प्रारूप में, डिलीमीटर के बीच में कुछ भी 'NULL' को इंगित करता है, खाली स्ट्रिंग नहीं, जो एक संख्यात्मक मान के लिए वैध वाक्यविन्यास है। रिक्त तार खाली डबल कोट्स के रूप में लिखे गए हैं: '" "'। –

+0

यदि मेरे जैसे कोई भी ईएसविन की सीएसवी फाइलों में रिक्त संकेतों को खाली तारों के बारे में उपयोगी टिप्पणी से भ्रमित हो जाता है - मैं एक टेक्स्ट (टीएसवी) फ़ाइल का उपयोग कर रहा था ... यह रिक्त मानों के लिए एक अलग प्रतीक है: '\ N'। – Sigfried

2
की तरह है कि आप हमेशा अपने ऑपरेटिंग सिस्टम और PostgreSQL की संस्करण संख्या के बारे में जानकारी शामिल करना चाहिए एक सवाल के साथ

अपने बयान संदिग्ध है:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV; 

DELIMITERS 7,3 से पहले के संस्करणों में इस्तेमाल किया गया था। पुराने कोड को तोड़ने के क्रम में यह अभी भी समर्थित है, लेकिन इसका उपयोग न करें। उचित कीवर्ड DELIMITER है। और आपको , निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि यह FORMAT CSV के लिए डिफ़ॉल्ट है।
इसके अलावा, मैं manual here बोली:

filename

The absolute path name of the input or output file. Windows users might need to use an E'' string and double any backslashes used in the path name.

तो, अपने 'data.dat' यूनिक्स पर '/path/to/data.dat' की तरह कुछ या E'C:\\path\\to\\data.dat' विंडोज पर होना चाहिए।

संस्करणों 7.3+ उपयोग करें:

COPY data FROM '/path/to/data.dat' CSV 

संस्करणों के लिए 9.0+ उपयोग:

COPY data FROM '/path/to/data.dat' (FORMAT CSV) 

आप अभी भी इस त्रुटि मिलती है: स्पष्ट रूप से फिर

ERROR: invalid input syntax for type numeric: CONTEXT: COPY data, line 13, column interval_2400:

, स्रोत फ़ाइल की संरचना से मेल नहीं खाता है तालिका data। अपनी स्रोत फ़ाइल पर नज़र डालें, लाइन 13 पर जाएं और देखें कि कॉलम interval_2400 कॉलम के लिए क्या मूल्य है। संभावना है, यह संख्यात्मक नहीं है। आप या तो स्रोत फ़ाइल को ठीक कर सकते या अनुकूलन तालिका परिभाषा:

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text; 

या क्या कभी टाइप अधिक उपयुक्त है। नाम से निर्णय लेने के लिए interval हो सकता है।

+0

पोस्टग्रेएसक्यूएल 9.1.1, मैकॉक्स 10.7.2। जैसा कि मैंने उपरोक्त उल्लेख किया है, आयात फ़ाइल की पहली 12 पंक्तियों के लिए ठीक काम करता है। कॉलम वास्तव में संख्यात्मक हैं और तालिका परिभाषा से मेल खाते हैं। यह सिर्फ कुछ पंक्तियों में मूल्य गुम है। – ugh

+0

@ user1076175: कृपया अपनी डेटा फ़ाइल की पहली 15 पंक्तियों के साथ अपना प्रश्न संपादित करें। अपने प्रश्न में संस्करण जानकारी भी डालें (मेरे उत्तर पर टिप्पणी में नहीं)। –

+0

मुख्य समस्या भ्रष्ट सीएसवी की है। अभी मेरे पास 50 जीबी बड़ा सीएसवी है जो प्रत्येक दो 1000 लाइनों पर एक क्षेत्र के साथ एक खराब रेखा है। तो सवाल यह है कि हम postgresql को केवल उन पंक्तियों पर जाने के लिए बता सकते हैं जो त्रुटि फेंकते हैं और बाकी को जारी रखते हैं। – Smalcat

-1

कोई भी छोटी फाइलों के साथ यहां आ रहा है: यहां मुझे सबसे आसान फिक्स मिला है और सीएसवी में असंगत संख्या में डिलीमीटर हैं।

  1. अपना सीएसवी खोलें।
  2. Ctrl + Shift + 8 (सभी डेटा का चयन करता है)
  3. Ctrl + H (की जगह मिल जाए खुलता है)
  4. खोज बॉक्स खाली इसलिए इसकी 0 लंबाई के तार की तलाश में छोड़ दें।
  5. बॉक्स के साथ प्रतिस्थापित जगह में एक स्थान दर्ज करें।

पूरे सीएसवी के माध्यम से हो जाएगा ताकि पाश और सीमांकक में सही स्तंभ गणना के लिए यह बल (,) भले ही थेरेस उस कॉलम में कोई डाटा नहीं।

यदि आप एक्सेल के साथ ठीक हैं तो आप इसे मैक्रो में भी बदल सकते हैं, इसलिए मेरा मैक्रो (Ctrl + g) इसे एक ही बार में करता है। Creating a Macro

0

यह पोस्टग्रेएसक्यूएल बग है - सीएसवी पार्सर अंतिम खाली आइटम को अनदेखा करता है और त्रुटि फेंक देता है - "पीजी :: BadCopyFileFormat: त्रुटि: कॉलम के लिए डेटा गायब"।

मैं कर रहा हूँ एक बेवकूफ हैक का उपयोग करें:

1,2,3 
1,2,, 

इस ऐड याद किया अंतिम आइटम पंक्ति में डेटा आयात करने के:

तो पिछले आइटम खाली है, सरल एक एक सीमांकक स्ट्रिंग के अंत में जोड़ें।

0

एक अतिरिक्त चेतावनी- त्रुटि की रेखा संख्या की जांच करें और सुनिश्चित करें कि यह CSV फ़ाइल में एक खाली पंक्ति नहीं है। इससे पोस्टग्रेस गुम मूल्यों के बारे में एक ही त्रुटि फेंकने का कारण बन जाएगा।

संबंधित मुद्दे