2009-02-03 9 views
11

में रिक्त स्थान पर टैब को कन्वर्ट करें मैं नियमित अभिव्यक्तियों का उपयोग करके एक टेक्स्ट पार्सर बना रहा हूं। मुझे सभी टैब अक्षरों को स्ट्रिंग में स्पेस वर्णों में कनवर्ट करने की आवश्यकता है। मैं यह नहीं मान सकता कि टैब में कितनी रिक्त स्थान शामिल होनी चाहिए अन्यथा मैं 4 स्पेस वर्णों के साथ एक टैब को प्रतिस्थापित कर सकता हूं। इस प्रकार की समस्या के लिए कोई अच्छा समाधान है। मुझे कोड में ऐसा करने की ज़रूरत है ताकि मैं बाहरी उपकरण का उपयोग न कर सकूं।एक .NET स्ट्रिंग


दुर्भाग्य से, इनमें से कोई भी उत्तर उस समस्या का समाधान नहीं करता जिसके साथ मुझे सामना करना पड़ रहा है। मैं बाहरी पाठ फ़ाइलों से पाठ निकालने जा रहा हूं और मैं यह नहीं समझ सकता कि उन्हें कैसे बनाया गया था या उन्हें बनाने के लिए किस ऑपरेटिंग सिस्टम का उपयोग किया गया था। मेरा मानना ​​है कि टैब चरित्र की लंबाई अलग-अलग हो सकती है, इसलिए जब मैं टेक्स्ट फ़ाइल पढ़ रहा हूं तो मुझे एक टैब का सामना करना पड़ता है, मैं जानना चाहता हूं कि मुझे कितने स्पेस अक्षर इसे बदलना चाहिए।

char tabs = '\u0009'; 
String newLine = withTabs.Replace(tabs.ToString(), " "); 
+2

यहां कुछ उत्तर टैब की अवधारणा की जानकारी नहीं है बंद हो जाता है (वैसे, यह भी सीपीयू कि में कुशल यह विशाल तार recopy नहीं करता है) (http देखना : //www.gnu.org/software/emacs/manual/html_node/emacs/Tab-Stops.html और http://www.jwz.org/doc/tabs-vs-spaces.html)। @कल, निक-मैककोइन और उपयोगकर्ता 275640 सही उत्तर हैं। – Jonke

+0

@ जोन्के ने 4 या 8 रिक्त स्थान के साथ टैब स्टॉप को सही ढंग से निर्धारित करने के लिए एक नया समाधान पोस्ट किया। – HappyTown

उत्तर

0

आप समारोह की जगह उपयोग कर सकते हैं? एक त्वरित और गंदे विकल्प है:

output = input.Replace("\t", "".PadRight(N, (char)" ")); 

जाहिर एन कहीं से परिभाषित करने की, यह उपयोगकर्ता इनपुट या कार्यक्रम में कहीं और हो गया है।

+0

लगता है कि वह चाहता है कि परिणाम टैब स्टॉप पर अभी भी लाइन पर बने रहें –

+0

काम नहीं करता है क्योंकि यह खाता टैब नहीं लेता है जो पहले से ही टैब स्टॉप गठबंधन नहीं है (देखें @HappyTown उत्तर)। 4 "aa \ tb" की टैब चौड़ाई मानते हैं "aa____b" नहीं "aa__b"। – Sprotty

-1

आप रिक्तियों एन करने के लिए टैब कन्वर्ट करने के लिए सक्षम होना चाहते हैं:

-1
Regex.Replace(input,"\t"," "); 
+0

काम नहीं करता है क्योंकि यह खाता टैब नहीं लेता है जो टैबविड्थ गठबंधन नहीं हैं (देखें @HappyTown उत्तर)। – Sprotty

15

दुर्भाग्यवश, आपको यह मानने की आवश्यकता है कि टैब कितने रिक्त स्थान का प्रतिनिधित्व करता है। आपको इसे एक निश्चित मान (जैसे चार वर्णित) पर सेट करना चाहिए या इसे उपयोगकर्ता विकल्प बनाना चाहिए।

यह करने के लिए तेज तरीका नेट है (मैं सी # का उपयोग कर रहा है):

var NewString = "This is a string with a Tab"; 
var TabLength = 4; 
var TabSpace = new String(' ', TabLength); 

NewString = NewString.Replace("\t", TabSpace); 

फिर आप कुछ भी आप चाहते हैं TabLength चर बदल सकते हैं आम तौर पर पहले से, चार अंतरिक्ष पात्रों के रूप में उल्लेख किया है।

सभी ऑपरेटिंग सिस्टम में टैब एक ही लंबाई, एक टैब हैं! सॉफ़्टवेयर उन्हें प्रदर्शित करने का तरीका अलग-अलग है, आमतौर पर यह चार स्पेस वर्णों की समतुल्य चौड़ाई है, और यह भी मानता है कि डिस्प्ले एक निश्चित चौड़ाई फ़ॉन्ट का उपयोग कर रहा है जैसे कि Courier New

उदाहरण के लिए, मेरा IDE of choice मुझे टैब वर्ण की चौड़ाई को उस मूल्य पर बदलने की अनुमति देता है जो मुझे उपयुक्त बनाता है।

+2

टैब के लिए टैबस्पेस वर्णों के लिए टैब खाता है, बिल्कुल बिल्कुल नहीं। –

+0

@JoelCoehoorn ने 4 या 8 रिक्त स्थान तक टैब स्टॉप को सही ढंग से निर्धारित करने के लिए एक नया समाधान पोस्ट किया। – HappyTown

+0

यह कोई समाधान नहीं है क्योंकि यह खाता टैब नहीं लेता है जो पहले से ही टैब स्टॉप गठबंधन नहीं हैं (देखें @HappyTown उत्तर)। 4 "aa \ tb" की टैब चौड़ाई मानते हैं "aa____b" नहीं "aa__b" – Sprotty

-1

मुझे सच में यकीन नहीं है कि "मैं यह नहीं मान सकता कि टैब में कितनी रिक्त स्थान शामिल होनी चाहिए", लेकिन यह उदाहरण आपके द्वारा निर्दिष्ट किसी भी रिक्त स्थान के साथ टैब को प्रतिस्थापित करेगा।

public static string ReplaceTabs(string value, int numSpaces) 
{ 
    string spaces = new String(' ', numSpaces); 
    return value.Replace("\t", spaces);  
} 
+0

काम नहीं करता है क्योंकि यह खाता टैब नहीं लेता है जो पहले से ही टैब स्टॉप संरेखित नहीं हैं (देखें @HappyTown उत्तर)। 4 "aa \ tb" की टैब चौड़ाई मानते हैं "aa____b" नहीं "aa__b"। – Sprotty

3

मुझे लगता है कि आप क्या कहना चाहते हैं कि आप उन टैबों को प्रभावी स्थान के साथ बदलना चाहते हैं, जिन्हें वे विस्तारित कर रहे थे। दिमाग में आने वाला पहला तरीका नियमित अभिव्यक्तियों को शामिल नहीं करता है (और मुझे नहीं पता कि इस समस्या को उनके साथ हल किया जा सकता है)।

  • स्ट्रिंग में स्ट्रिंग वर्ण के माध्यम से चरण, स्ट्रिंग में अपनी वर्तमान स्थिति का ट्रैक रखते हुए।
  • जब आपको कोई टैब मिलता है, तो उसे एन स्पेस के साथ प्रतिस्थापित करें, जहां N = tab_length - (current_position % tab_length)
  • अपनी वर्तमान स्थिति में एन जोड़ें और स्ट्रिंग के बावजूद जारी रखें।
6

मुझे यकीन नहीं है कि यूनिक्स टेक्स्ट फ़ाइल से टैब कैसे पढ़े जाएंगे, या जो भी आपके विभिन्न प्रारूप हैं, लेकिन यह इनलाइन टेक्स्ट के लिए काम करता है। शायद यह मदद करेगा।

var textWithTabs = "some\tvalues\tseperated\twith\ttabs"; 
var textWithSpaces = string.Empty; 

var textValues = textWithTabs.Split('\t'); 

foreach (var val in textValues) 
{ 
    textWithSpaces += val + new string(' ', 8 - val.Length % 8); 
} 

Console.WriteLine(textWithTabs); 
Console.WriteLine(textWithSpaces); 
Console.Read(); 
+0

अवधारणा ठीक दिखती है, लेकिन स्ट्रिंग पर + = बड़े तारों पर बहुत धीमी होगी। – Sprotty

-1

मुझे लगता है कि हर किसी ने इसे कवर किया है, लेकिन एक टैब चरित्र बस यही है। एक चरित्र .. चरित्र का प्रतिनिधित्व \ t .. प्रत्येक एप्लिकेशन इसे एक स्थान, दो रिक्त स्थान, 4 रिक्त स्थान, एक स्माइली के साथ प्रदर्शित करना चुन सकता है .. जो कुछ भी .. तो .. इसका कोई वास्तविक जवाब नहीं है।

1

यह वही है जो वे ज़रूरत के बारे में बात कर रहे हैं। मैंने इसे Visual Basic 6.0 में लिखा था। मैंने कुछ त्वरित VB.NET 2010 अपडेट किए हैं, लेकिन यह इसके लिए कुछ बेहतर फ़िक्सिंग का उपयोग कर सकता है। बस वांछित टैब चौड़ाई सुनिश्चित करें और सेट करें; यह वहां 8 पर सेट है। बस इसे स्ट्रिंग भेज सकते हैं या यहां तक ​​कि उन्हें सही पाठ बॉक्स की तरह तो अंदर ठीक:

RichTextBox1.Text = strFixTab(RichTextBox1.Text) 

Function strFixTab(ByVal TheStr As String) As String 
    Dim c As Integer 
    Dim i As Integer 
    Dim T As Integer 
    Dim RetStr As String 
    Dim ch As String 
    Dim TabWidth as Integer = 8 ' Set the desired tab width 

    c = 1 
    For i = 1 To TheStr.Length 
     ch = Mid(TheStr, i, 1) 
     If ch = vbTab Then 
      T = (TabWidth + 1) - (c Mod TabWidth) 
      If T = TabWidth + 1 Then T = 1 
      RetStr &= Space(T) 
      c += T - 1 
     Else 
      RetStr &= ch 
     End If 
     If ch = vbCr Or ch = vbLf Then 
      c = 1 
     Else 
      c += 1 
     End If 
    Next 
    Return RetStr 
End Function 
1

(आप कैसे एक संपादक में रिक्त स्थान के लिए टैब में परिवर्तित करने के लिए देख रहे हैं, मेरा उत्तर के अंत में देखें)

लगभग 8 साल का सवाल, लेकिन मुझे हाल ही में रिक्त स्थान वाले टैब को प्रतिस्थापित करने की आवश्यकता है।

समाधान के साथ 4 या 8 रिक्त स्थान के साथ टैब को प्रतिस्थापित करता है।

तर्क इनपुट स्ट्रिंग, एक समय में एक वर्ण के माध्यम से पुनरावृत्त करता है और आउटपुट स्ट्रिंग में वर्तमान स्थिति (कॉलम #) का ट्रैक रखता है।

  • यह \t (टैब वर्ण) का सामना करना पड़ता है - अगले टैब स्टॉप ढूँढता है, की गणना करता है कि कितने रिक्त स्थान यह अगले टैब बंद करने के लिए मिल की जरूरत है, रिक्त स्थान की संख्या के साथ उन \ t बदल देता है।
  • यदि \n (नई लाइन) - इसे आउटपुट स्ट्रिंग में जोड़ता है और स्थिति पॉइंटर को नई लाइन पर रीसेट करता है। विंडोज़ पर नई लाइनें \r\n हैं और यूनिक्स (या स्वाद) पर \n का उपयोग करें, इसलिए मुझे लगता है कि यह दोनों प्लेटफार्मों के लिए काम करना चाहिए। मैंने विंडोज़ पर परीक्षण किया है, लेकिन यूनिक्स को आसान नहीं है।
  • कोई अन्य पात्र - इसे आउटपुट स्ट्रिंग में जोड़ता है और स्थिति को बढ़ाता है।

using System.Text; 

namespace CSharpScratchPad 
{ 
    class TabToSpaceConvertor 
    { 
     static int GetNearestTabStop(int currentPosition, int tabLength) 
     { 
      // if already at the tab stop, jump to the next tab stop. 
      if ((currentPosition % tabLength) == 1) 
       currentPosition += tabLength; 
      else 
      { 
       // if in the middle of two tab stops, move forward to the nearest. 
       for (int i = 0; i < tabLength; i++, currentPosition++) 
        if ((currentPosition % tabLength) == 1) 
         break; 
      } 

      return currentPosition; 
     } 

     public static string Process(string input, int tabLength) 
     { 
      if (string.IsNullOrEmpty(input)) 
       return input; 

      StringBuilder output = new StringBuilder(); 

      int positionInOutput = 1; 
      foreach (var c in input) 
      { 
       switch (c) 
       { 
        case '\t': 
         int spacesToAdd = GetNearestTabStop(positionInOutput, tabLength) - positionInOutput; 
         output.Append(new string(' ', spacesToAdd)); 
         positionInOutput += spacesToAdd; 
         break; 

        case '\n': 
         output.Append(c); 
         positionInOutput = 1; 
         break; 

        default: 
         output.Append(c); 
         positionInOutput++; 
         break; 
       } 
      } 
      return output.ToString(); 
     } 
    } 
} 

बुला कोड की तरह

string input = "I\tlove\tYosemite\tNational\tPark\t\t,\t\t\tGrand Canyon,\n\t\tand\tZion"; 
string output = CSharpScratchPad.TabToSpaceConvertor.Process(input, 4); 

आउटपुट स्ट्रिंग होगा मूल्य

I love Yosemite National Park  ,   Grand Canyon, 
     and Zion 

मिलेगा मैं कैसे एक संपादक में रिक्त स्थान के लिए टैब में परिवर्तित?

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

Notepad++:    Edit > Blank Operations > TAB to Space 
Visual Studio:   Edit > Advanced > Untabify Selected Lines 
SQL Management Studio: Edit > Advanced > Untabify Selected Lines 
+0

मैं कुछ कारणों से कोड स्निपेट में कोड की पहली पंक्ति नहीं जोड़ सकता, 'System.Text;' का उपयोग कर रहा हूं। Stackoverflow स्वरूपण के साथ गड़बड़ कर देता है .. – HappyTown

+1

कोड नमूना से पहले अंतिम पाठ एक सूची है। सूची एक ही सूची आइटम तत्व में निरंतरता अनुच्छेद को चिह्नित करने के लिए कोड नमूने के रूप में एक ही इंडेंटेशन का उपयोग करती है। मैं आमतौर पर सूची को "रीसेट" करने के लिए एकल अवधि (।) का उपयोग करता हूं, और फिर कोड सही ढंग से दिखाया जाएगा। –

+0

@JoelCoehoorn इसे ठीक करने के लिए धन्यवाद और इसे ठीक करने का तरीका दिखा रहा है। – HappyTown

0

मुझे यकीन नहीं है कि मेरा समाधान निष्पादन में अधिक कुशल है लेकिन यह कोड में अधिक कॉम्पैक्ट है।यह @ckal द्वारा समाधान के करीब है लेकिन '+ =' के बजाय जॉइन फ़ंक्शन का उपयोग करके विभाजित तारों को फिर से इकट्ठा करता है।

public static string ExpandTabs(string input, int tabLength) 
{ 
    string[] parts = input.Split('\t'); 
    int count = 0; 
    int maxpart = parts.Count() - 1; 
    foreach (string part in parts) 
    { 
     if (count < maxpart) 
      parts[count] = part + new string(' ', tabLength - (part.Length % tabLength)); 
     count++; 
    } 
    return(string.Join("", parts)); 
} 
0

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

public static string TabsToSpaces(string inTxt, int tabLen=4) 
    { 
     var outTxt = new List<string>(); 

     var textValues = inTxt.Split('\t'); 

     foreach (var val in textValues) 
     { 
      var lines = val.Split("\r"); 
      var preTxt = lines[lines.Length - 1]; 
      preTxt = preTxt.Replace("\n", ""); 
      var numSpaces = tabLen - preTxt.Length % tabLen; 
      if (numSpaces == 0) 
       numSpaces = tabLen; 
      outTxt.Add(val + new string(' ',numSpaces)); 
     } 
     return String.Join("",outTxt); 
    } 

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