2008-10-02 7 views
17

से निश्चित चौड़ाई रिकॉर्ड पढ़ें मेरे पास रिकॉर्ड से भरा एक टेक्स्ट फ़ाइल है जहां प्रत्येक रिकॉर्ड में प्रत्येक फ़ील्ड एक निश्चित चौड़ाई है। मेरा पहला दृष्टिकोण स्ट्रिंग.Substring() का उपयोग करके बस प्रत्येक रिकॉर्ड को पार्स करना होगा। क्या कोई बेहतर तरीका है?टेक्स्ट फ़ाइल

उदाहरण के लिए, प्रारूप के रूप में वर्णित किया जा सकता:

<Field1(8)><Field2(16)><Field3(12)> 

और दो रिकॉर्ड के साथ एक उदाहरण फ़ाइल दिखाई देगा:

SomeData000000000SomeMoreData 
Data2 0000000000555555MoreData  

मैं सिर्फ यकीन है कि मैं अनदेखी नहीं कर रहा हूँ बनाना चाहते Substring() से एक और अधिक सुरुचिपूर्ण तरीका।


अद्यतन: मैं अंत में Killersponge की तरह एक regex के साथ चला गया सुझाव:

private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled); 
const string REGEX_LOT = "^(?<Field1>.{6})" + 
         "(?<Field2>.{16})" + 
         "(?<Field3>.{12})"; 

मैं तो क्षेत्रों तक पहुँचने के लिए निम्नलिखित का उपयोग करें:

Match match = reLot.Match(record); 
string field1 = match.Groups["Field1"].Value; 

उत्तर

5

सबस्ट्रिंग मेरे लिए अच्छा लगता है। एकमात्र नकारात्मक पक्ष मैं तुरंत सोच सकता हूं कि इसका मतलब है कि हर बार डेटा की प्रतिलिपि बनाना, लेकिन जब तक आप साबित न करें कि यह एक बाधा है, तब तक मैं इसके बारे में चिंता नहीं करता। सबस्ट्रिंग सरल है :)

एक समय में एक पूरे रिकॉर्ड से मेल खाने और खेतों को कैप्चर करने के लिए रेगेक्स का उपयोग कर सकता है, लेकिन मुझे लगता है कि यह अधिक होगा।

+0

हाँ, मैंने रेगेक्स का उपयोग करने के तरीके के बारे में सोचने की कोशिश की, लेकिन लगता है कि यह नौकरी के लिए गलत उपकरण है और जैसा आपने कहा, ओवरकिल। –

+0

regex?^(। {8}) (। {16}) (। *) $ फ़ील्ड की उपरोक्त परिभाषा के लिए, यह मानते हुए कि अंतिम क्षेत्र रिक्त स्थान के साथ गद्देदार हो सकता है या नहीं। – Sekhat

1

नहीं, सबस्ट्रिंग ठीक है । यही वह है।

2

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

21

FileHelpers का उपयोग करें।

उदाहरण:

[FixedLengthRecord()] 
public class MyData 
{ 
    [FieldFixedLength(8)] 
    public string someData; 

    [FieldFixedLength(16)] 
    public int SomeNumber; 

    [FieldFixedLength(12)] 
    [FieldTrim(TrimMode.Right)] 
    public string someMoreData; 
} 

फिर, यह इस रूप में सरल है:

var engine = new FileHelperEngine<MyData>(); 

// To Read Use: 
var res = engine.ReadFile("FileIn.txt"); 

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 
+0

कुछ जेनिक्स की ज़रूरत है, शायद मुझे एक नज़र डालना चाहिए और इसे करना चाहिए: पी – Sekhat

+0

या नहीं, ऐसा लगता है कि यह पहले से ही किया जा चुका है: पी – Sekhat

+2

-1 बाह्य पुस्तकालय निर्भर समाधान, उपोष्टतम के लिए। –

1

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

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