सीमांकित फ़ाइलों को संभालने का सबसे अच्छा तरीका


16

इसलिए आम तौर पर एक CSV फ़ाइल फ़ील्ड और लाइन सीमांकक के रूप में एक अल्पविराम और रिटर्न वर्ण का उपयोग करती है।

यह पाठ के साथ स्पष्ट समस्याओं में चलता है जिसमें ये दोनों वर्ण हो सकते हैं।

जाहिर है कि वहाँ विकल्प हैं (उन्हें छोड़कर) लेकिन लोग इसे कैसे संभालते हैं? विभिन्न वर्णों का उपयोग करें - पाइप या टिल्डस? उनसे बचिए? सीमांकित फ़ाइलों का उपयोग न करें, आखिरकार यह 2010 है और हमारे पास अब एक्सएमएल है?

समस्याओं को न देखने के एक अच्छे अवसर के लिए कम से कम प्रयास करना।

(बस स्पष्ट होने के लिए, यह कुछ अधिक ठोस होने के बजाय जिज्ञासा से बाहर का प्रश्न है - यह कुछ ऐसा है जो मैं समय और समय के खिलाफ आया हूं फिर से डेटा के साथ खेल रहा हूं, हमेशा इसे गोल किया गया है लेकिन यह आम तौर पर थोड़ा, अच्छा, गंदा लगता है) और आश्चर्य है कि अन्य लोगों का अनुभव क्या था)।


CSV का उपयोग करने के बारे में सावधानी से सोचें - इससे निपटना अच्छा है और आसान है (सामान्य भागने के नियमों के लिए उत्तर देखें), लेकिन यह लगभग उतना ही चलने योग्य नहीं है जितना होना चाहिए - यदि आप अपने स्वयं के कार्यक्रमों के साथ संचार कर रहे हैं तो यह ठीक है, लेकिन यदि आप कहीं और आयात करना चाहते हैं यह थोड़ा अजीब है क्योंकि विभिन्न कार्यक्रम अलग-अलग भागने के नियमों का पालन करते हैं।
माइकल कोहेन

@ मिचेल - बिलकुल। मुद्दा हालांकि यह है कि यह इतना सर्वव्यापी है कि आप लगभग हमेशा ऐसे समय में आएंगे जब यह बहुत ही आकर्षक विकल्प होगा, और कई पुराने सिस्टम के मामले में यह एकमात्र विकल्प है।
जॉन हॉपकिंस

चरित्र पुस्तकालयों को पढ़ने और लिखने के लिए कई भाषाओं में परिपक्व पुस्तकालय मौजूद हैं (निश्चित रूप से आम हैं)। वे किसी भी स्थिति को संभाल लेंगे। अपने स्वयं के CSV पार्सर लिखना एक सामान्य प्रकार का प्रतिमान है।
क्वेंटिन-स्टारिन

जवाबों:


13

विकिपीडिया के अनुसार :

एम्बेडेड कॉमा के साथ फ़ील्ड को दोहरे-उद्धरण वर्णों के भीतर संलग्न किया जाना चाहिए।

और इसके अलावा:

एम्बेडेड दोहरे-उद्धरण वर्ण वाले फ़ील्ड को दोहरे-उद्धरण वर्णों के भीतर संलग्न किया जाना चाहिए, और एम्बेडेड डबल-उद्धरण वर्णों में से प्रत्येक को दोहरे-उद्धरण वर्णों की एक जोड़ी द्वारा दर्शाया जाना चाहिए।

मुझे नहीं पता कि किसने आविष्कार किया था, लेकिन यह प्रभावी रूप से दिखाता है कि आखिरकार आपको बचना होगा। यह एकमात्र ठोस समाधान है। बाकी सब कुछ सिर्फ डक्ट टेप के ऊपर डक्ट टेप है: शायद अब के लिए काम करता है, लेकिन आखिरकार आप एक ऐसे मामले से टकराएंगे, जहां आपको एक अपवाद के अपवाद की आवश्यकता होती है, और यह आपके नियमों के मैलाबॉल से पहले नहीं लेता है रास्ता एक सरल बच चरित्र समाधान की तुलना में अधिक जटिल था।

ऐसा लगता है कि CSV रचनाकारों ने पहले दोहरे-उद्धरण वाले विशेष वाक्यविन्यास के साथ आने से बचने से बचने की कोशिश की, जिससे अल्पविराम को बचाने की अनुमति मिली, लेकिन तब कोई दोहरे उद्धरण-वर्णों को भी बचाना चाहता था, इसलिए उन्हें उस बिंदु पर भागना पड़ा - फ़न का उपयोग करके बच चरित्र के रूप में डबल-कोट। अगर उन्होंने पहली बार में ठीक से भागने का फैसला किया था, तो अब सिंटैक्स सरल होगा।


3
क्या होना चाहिए, और क्या है .. अक्सर अलग है :)
टिम पोस्ट

मुझे लगता है कि समाधान काफी ठीक है। सरल डेटा के लिए, सीएसवी ठीक, जटिल डेटा के लिए तो आवश्यक है के हवाले से, और भागने काम करता है "" के साथ "निशान बुनियादी करने के लिए वापस।
Ernelli

1
@ इरेनेलि: अब जब मैं इसके बारे में अधिक सोचता हूं, तो यह वास्तव में मानव-पठनीयता और सरलता के बीच एक उचित समझौता हो सकता है। भागने में समस्या यह है कि यह मनुष्यों के लिए बदसूरत दिखता है , भले ही यह कंप्यूटर को पार्स करने के लिए तुच्छ हो । इस प्रकार, केवल दुर्लभ मामलों के लिए बच निकलता है ("एम्बेडेड दोहरे-उद्धरण वर्ण वाले फ़ील्ड") आउटपुट उत्पन्न करता है जो आमतौर पर काफी मानव-पठनीय दिखता है। यह एक अच्छा समाधान है, यह मानते हुए कि क्षेत्र के नामों में अल्पविराम का उपयोग क्षेत्र के नामों के दोहरे उद्धरणों की तुलना में अधिक बार किया जाता है।
जूनस पुलका डे

2

मैं मान रहा हूँ कि आपके पास कुछ ऐसा है:

Foo,Baz,,,"Foo,Baz"

यदि स्ट्रिंग में सीमांकक शामिल है या उद्धृत नहीं किया गया है, तो आपके पास फ़ाइल पार्स करने का कोई वास्तविक विश्वसनीय तरीका नहीं है ।

हालाँकि, आप डेटा को पार्स और निष्कर्ष निकालने के लिए जाँच सकते हैं जैसे:

  • कॉम्मा अलग किए गए फ्लोट्स को एक स्ट्रिंग के रूप में माना जाना चाहिए
  • यदि इससे पहले या बाद में लाइन में कम सीमांकक हैं, तो इस रेखा को छोड़ें और इसे लॉग इन करें
  • 'जैसे' समझो

आपको सामान को संभालने के लिए एक पार्सर लिखना होगा, लेकिन इसे जटिल नहीं होना चाहिए।

मेरे अनुभव में, एक्सेल जैसी किसी चीज से बड़े पैमाने पर डंप का आयात करना हमेशा वापस जाने और कुछ ऑडबॉल की समीक्षा करने के परिणामस्वरूप होता है। आपका चुनौती अपने कार्यक्रम दे रहा है सिर्फ इसलिए डेटा के बारे में है कि यह एक पागल डालने नहीं करता है पर्याप्त सामान्य ज्ञान। फिर समीक्षा करें कि क्या लॉग किया गया था और धो / कुल्ला / दोहराएं।

मैंने एक बार एक छोटी सी कंपनी के लिए एक आंतरिक FAQ को संभाला जिसमें सभी Ubuntu वर्कस्टेशन का उपयोग किया गया था। एफएक्यू के एक हिस्से ने 'शेल शॉर्टकट' दिए, और यह मेरे लिए सीमांकित पाइप आया। खैर, जवाब भी आमतौर पर पाइप सीमांकित थे (यानी grep foo | कुछ) और उद्धृत या बच नहीं गए। मुझे लगता है कि दर्द :)


2

CSV के साथ कुछ भी गलत नहीं है

CSV कठोरता से परिभाषित डेटा के लिए अच्छी तरह से काम करता है जो प्रारूप बदलने की संभावना नहीं है और प्राप्तकर्ता पार्सर पर कई आश्चर्य नहीं करता है।

यहाँ बड़े गोचरों की एक आसान सूची है:

  1. "" S के भीतर "बचना" (फ़ील्ड में फ़ील्ड सीमांकक होता है)
  2. CRLFs युक्त (फ़ील्ड में लाइन सीमांकक होता है)
  3. यूनिकोड (अंतर्निहित पाठ प्रारूप अपर्याप्त हो सकता है)
  4. अलग-अलग ओएस के लिए अलग-अलग लाइन टर्मिनेटर (सीआर या सीआरएलएफ या एलएफ या एनयूएल है?)
  5. इनलाइन टिप्पणियां (#, //, -, आदि के साथ उपसर्ग रेखा;)
  6. संस्करण प्रबंधन (फ़ाइल के नवीनतम संस्करण में कम या ज्यादा क्षेत्र शामिल हैं)
  7. NULL और खाली डेटा (, "", के बीच अंतर करना रिक्त है, लेकिन, null है?)

आप इसे मेटा-डेटा हेडर के साथ संपर्क कर सकते हैं जो बताता है कि खेतों को कैसे पार्स किया जाना चाहिए, लेकिन फिर आप बस एक्सएमएल का उपयोग कर सकते हैं। यह इस तरह के फ्रीफॉर्म CSV मेस के कारण है कि इसका आविष्कार किया गया था। एक्सएमएल दृष्टिकोण बस के लिए बहुत भारी लगता है, इसके चेहरे पर, एक साधारण समस्या हो सकती है।

एक लोकप्रिय विकल्प "अजीब चरित्र सीमांकक" रणनीति है। यह ऊपर भागने के मुद्दों का एक बहुत कुछ हो जाता है क्योंकि आप कुछ का उपयोग करते हैं | क्षेत्र परिसीमन के लिए (पाइप) चरित्र, और रिकॉर्ड समाप्ति के लिए एक CRLF। यह मल्टी-लाइन फ़ील्ड समस्या के आसपास नहीं मिलता है (जब तक कि आप फ़ील्ड काउंटर का उपयोग नहीं करते हैं) लेकिन आपको मनुष्यों के लिए अच्छी तरह से स्वरूपित लाइनें मिलती हैं।

कुल मिलाकर, अगर आप इस तरह की फ़ाइल को संभालने का एक सरल तरीका खोज रहे हैं, तो जावा दुनिया में, आप बस OpenCSV को इस पर फेंक सकते हैं । इस तरह आप एक स्थापित ढांचे में सभी समस्याओं को दूर करते हैं।


2

CSV अभी भी कई स्थितियों में एक मान्य प्रारूप है, खासकर क्योंकि यह अभी भी एक ग्राहक के लिए डेटा लिखने का सबसे आसान तरीका है जिसे आपके आवेदन में आयात करने की आवश्यकता है। हमारे ग्राहकों में से कुछ एक्सएमएल से निपटना पसंद करते हैं, शायद इसलिए कि यह बहुत क्रियात्मक है और इसमें सभी "डरावने" कोण कोष्ठक हैं। यह उनके लिए इतना सरल है कि वे अपने दिमाग को एक सहमत चरित्र द्वारा अलग की गई वस्तुओं की एक साधारण सूची के चारों ओर लपेटें, और इस बात से भी सहमत हैं कि एक क्षेत्र की सामग्री में उसी चरित्र की अनुमति नहीं होगी।

उस ने कहा, आपको अभी भी इनपुट को सही ढंग से संभालना है और उन स्थितियों की जांच करनी है जहां वे अमान्य वर्णों का उपयोग करते हैं। मैंने अपनी CSV पार्सिंग जरूरतों के लिए FileHelpers का उपयोग करना शुरू कर दिया है।


1

मैं सामान्य रूप से मानक से चिपक जाता हूं और उनसे बच जाता हूं। ज्यादातर प्रोग्रामिंग लैंग्वेज में अच्छी बिल्डइन सपोर्ट या अच्छी लाइब्रेरी उपलब्ध है।

यह उस स्थिति पर निर्भर करता है जो प्रारूप का उपयोग किया जाएगा और सीएसवी सरल डेटा प्रारूप संरचनाओं का आदान-प्रदान करने के लिए एक उचित प्रारूप है।


0

CSV को भूल जाओ, JSON का उपयोग करें । लिखना आसान है, आसान है। XML तो 2005 की है


6
और एक ही समस्या है जब आप एक चरित्र का उपयोग करना चाहते हैं जो JSON प्रारूप (जैसे {या) का हिस्सा है
Salandur

सलंदुर: बिलकुल नहीं! भागने के सही नियम हैं! लेकिन {और, भागने की भी जरूरत नहीं है, क्योंकि अंदर स्ट्रिंग हैं, वे अस्पष्ट नहीं हैं!
user281377

1
अच्छी तरह से और अच्छा है, लेकिन मुझे याद नहीं है कि एक्सेल को "JSON को निर्यात करें" सुविधा है :) ऐसे समय होते हैं जब आपको विषम चीजों को पार्स करना होता है, यदि केवल उन्हें अधिक सहमत प्रारूप में लाने के लिए।
टिम पोस्ट

1
और JSON एक ही आकार की लगभग एक लाख वस्तुओं को पारित करने के लिए बस पूरी तरह से शानदार है। अरे रुको।
फ्रैंक शियरर

1
JSON इस सवाल के संबंध में CSV पर कोई सुधार नहीं करता है और महत्वपूर्ण रूप से कई अनुप्रयोगों (जैसा कि उल्लेख किया गया है, कार्यालय, SQL DBs आदि से आयात या निर्यात नहीं कर सकता है) के साथ अंतर में कमी है। JSON आंतरिक, हल्के वजन वाले क्लाइंट-साइड ऑपरेशन के लिए बहुत अच्छा है, लेकिन अनुप्रयोगों के बीच डेटा पास करने के लिए XML बहुत बेहतर है।
दान डिपलो

0

आमतौर पर, मैं खुद को जो कर रहा हूं वह सीएसवी फ़ाइल के बजाय टीएसवी (टैब-अलग-अलग मान) प्राप्त कर रहा है, फ़ाइल को एमएसीएस में खींचें और देखें कि इसमें से कौन सा कुछ असामान्य अक्षर का उपयोग करता है ($ आमतौर पर यहां के आसपास एक अच्छा विकल्प है), और फिर मैं सभी टैब को $ में बदल देता हूं।

वहां से, GNU AWK को क्षेत्र विभाजक के रूप में $ का उपयोग करने के लिए कहा जा सकता है, और बॉब आपके चाचा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.